• .NET Core 实战之短信服务-架构设计

    发布:51Code 时间: 2018-09-10 12:59

  • 前言 文章针对短信服务的架构设计和技术栈的简析。 源码地址: https://github.com/SkyChenSky/Sikiro.SMS 为什么需要架构设计 有人会问短信服务也要架构设计?不就写个service封装个send方法就...

  • 前言

    文章针对短信服务的架构设计和技术栈的简析。

    源码地址:

    https://github.com/SkyChenSky/Sikiro.SMS

    为什么需要架构设计

    有人会问短信服务也要架构设计?不就写个service封装个send方法就得了吗?干嘛还要大动干戈。

    如果在单块应用的情况下,以上面的做法是无可厚非的。

    然而架构设计解决的是应用复杂度,架构设计的大还是小取决于业务规模,技术的使用是要落实到应用场景。

    场景假设

    以我们公司作为例子:

    已拥有多套系统,运营后台、资金平台、账单平台、APP API等;

    需接入多个短信运营商,避免某个出异常后随时切换;

    及时发送、定时发送;

    从上面场景分析出,要由多系统、多平台接入需要单独抽离出来进行服务化,而且随着接入的系统越多,性能将成为瓶颈,因此需要良好的横向拓展能力。定时发送需要调度任务系统进行解决。

    因此下面为我设计的架构图

    架构图

    架构简析

    SmsApi服务

    以HTTP协议RESTful风格JSON格式提供给其他系统(服务)接入,以swagger作为服务描述提供对外查看。

    接口主要功能有:

    发送短信

    查询短信列表

    发送短信支持批量,接口接受到请求后将数据先持久化到MongoDB。

    如果及时发送则立刻发送RabbitMQ,再由Sikiro.SMS.Bus订阅队列进行统一发送;

    如果定时发送则等待Sikiro.SMS.Job进行轮循MongoDB,轮询到时的消息则发送到RabbitMQ,再由Sikiro.SMS.Bus订阅队列进行统一发送。

    Sikiro.SMS.Job调度任务服务

    此服务以Quartz.NET框架为基础,通过设计可以随意增加Trigger或者服务,使其多线程或多个进程同时运行,避免数据量大了后成为发送瓶颈。

    此服务不直接做短信发送,只是触发器的存在,通过RabbitMQ进行解耦,避免执行过程过长如果停止服务时则中断。

    Sikiro.SMS.Bus队列消费服务

    无论定时、及时短信都由该服务进行发送,如果接入了新的短信运营商,只需要停止该服务进行更新即可。停止了服务消息不会丢失,将暂存在RabbitMQ,因需对RabbitMQ的消息做持久化。

    可以在不同的服务器上部署服务,因为订阅同一个队列,良好的横向扩展保证了高可用、高性能

    可伸缩性

    可伸缩性指在不改变系统软硬件设计,仅仅通过新增服务器的情况下,就能提升系统的处理能力。

    HTTP API的无状态,在调度任务里的MongoDB原子操作FindOneAndUpdate的使用,多消费者的订阅都是为了可伸缩性。同时通过部署多台服务器也可以提高高性能与高可用。

    MongoDB的选择

    我选择MongoDB主要原因是聚合一致性、无模式。

    虽说不需要ACID但不代表没有一致性,而MongoDB体现的聚合一致性,以聚合做操作。

    聚合

    一组具有内聚关系的相关对象的称为集合

    关系型数据库

    则以下面两表通过SmsId关联读取,写入则两表作为一个事务

    MongoDB

    则以下面聚合方式表示,以聚合取,以聚合写

    无模式

    MongoDB一大特点则是无模式,意思是无需预先定义集合结构与字段类型,这体现了良好的拓展性。

    这是优点也是缺点,假如别的服务对该集合进行操作,在他不知情的情况下随意写入不同类型的值,则会影响已运行的服务。

    因此需要将此作为应用服务数据库,也就是服务化,把对集合的操作(读与写)以服务形式提供接口给其他服务使用。

    结尾

    该篇描述我的架构设计,下篇会正式对各个服务的实现进行讲解。如果您有更好的建议可以反馈。

    来自:陈珙
    文章来源:博客园
    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8103),我们将立即处理。

  • 上一篇:.Net Core应用框架Util介绍(一)

    下一篇:关于.NET Core是否应该支持WCF Hosting的争论

网站导航
Copyright(C)51Code软件开发网 2003-2018 , 沪ICP备16012939号-1