Github : https://github.com/makemyownlife/platform-sms

短信服务 platform-sms 0.5.0 发布 ,新的版本做了非常多的优化和改进。

1、支持发送任意时间延时短信;

2、优化三方渠道适配器加载逻辑;

3、支持 Docker 部署。

4、优化线程模型。

写这个项目的初心很简单:做一个简单易用的教学型项目,帮助工程师快速提升技术认知

这篇文章,我们聊聊短信服务中那些有趣的设计模式,希望对大家有所启发。

1 适配器模式

笔者曾经在科大讯飞教育部门,维护过一款短信服务,过程是相当痛苦。因为业务代码和渠道发送短信代码耦合度太高,为了将短信渠道从阿里云迁移到亿美短信,花费了大量的时间和精力。

所以,笔者在设计 platform-sms 时,考虑到两点:逻辑独立资源隔离

  • 逻辑独立:独立的模块内编写各自的发送短信的逻辑 ,彼此之间互不影响。
  • 资源隔离:通过类加载器加载需要的类,不会有包冲突等问题。

因此,笔者参考了开源项目 canal adapter 的设计方式。

部署目录来看,短信平台将三方渠道的相关逻辑独立在单独的文件夹 plugin 中。

服务端启动后,需要将插件加载到服务端容器中,加载完成之后,服务端可以根据渠道编号获取适配器(aliyuntencentemay)对象进行发送短信,申请短信模版等操作。

下图是适配器核心模块。

模块定义了 OuterAdapter 接口,一个完成的适配器需要实现如下的接口:

在阿里云、腾讯云各自的模块内实现 OuterAdapter 接口 ,并配置好接口限定名文件。

觉得神奇吧,这就是适配器模式的优雅!

2 线程模型

对于一个合理的系统来讲,一定要配置合理的线程模型 , 不同的线程用于不同的场景。

发送一条即时短信需要两种线程协同处理,tomcat 线程负责创建短信记录,即时短信处理线程池负责发送短信。

假如即时短信处理线程池在发送短信时断电,重试线程可以起到部分容错的功能。

3 延时消息

延时消息是非常有趣的功能,最新的版本支持任意时间的延时短信。

springboot controller 接收到发送短信请求后,通过「发送短信处理器」将请求存储到记录表。

Redis 有容量限制 ,我们不必将所有的数据存储在 Redis 里。处理延迟消息时,我们将短信数据做了冷热划分

  • 热数据:延时短信并不需要马上发送,而是延时单线程从延时队列中获取元素,获取到元素已经到了发送时间点了,则调用分发器发送短信。延时短信处理线程池会异步(相对延时服务单线程来讲)的执行发送短信。

  • 冷数据:定时任务加载下个自然小时的短信记录,load 到 Redis 延时队列里。

4 缓存实用技巧

1、本地缓存 + Redis PubSub 缓存同步

当客户端调用发送短信请求时,每次都需要鉴权,为了提升系统性能,应用信息都是从本地缓存中获取,然后判断客户端的请求是否合法。

应用信息就是存储在 ConcurrentHashMap 中 ,通过定时任务刷新缓存

为了保存缓存与数据库同步,我们采用 Pub/Sub 的方案。

下图,当我们启动两个短信平台应用,在短信平台 web 控制台修改应用信息时,我们发现两个应用的本地内存都发生变化了。

2、模板页面列表缓存教学

为了帮助大家学习列表缓存的技巧,笔者特意在模板页面做了教学演示。

我们使用列表缓存方案:查询对象ID列表,只缓存每个对象条目 。

SmsTemplateService 接口定义一个新的查询模板列表的方法 queryTemplates2

上图展示了模板条目缓存结果,性能相比直接从数据库查询得到显著的提升,平均性能提升 5 倍。

5 多种部署方式

短信平台可以支持多种部署方式:前后端分离前后端合并Docker

项目中我们通过使用 maven 多种插件技巧 ,同时依赖 springboot 的特性,实现生成前后端合并包,并提供了 windows、linux 一键启动 / 停止脚本等。

为了便于大家学习如何制作 Docker 镜像,笔者贴心的将 Docker 打包命令、以及启动容器的命令注释写到 Dockerfile 文件。

下图是我们启动短信服务 Docerk 容器的效果,非常简单。

6 未来规划

短信服务 platform-sms 代码中还有非常多的技巧,比如:

  • 优雅的创建单线程、多线程
  • 参考 RocketMQ 的通讯模块,实现了适配器的分发器
  • Redis 实现分布式锁
  • 定制 SDK 与服务端通讯协议

笔者也会继续优化 platform-sms ,规划列表:

  • 控制台实现批量发送短信
  • 更加灵活易用的绑定模板
  • 限流配置(接口、应用、手机多个维度)

开源短信项目 platform-sms 发布了新版本 0.5.0的更多相关文章

  1. Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布

    https://www.bilibili.com/video/BV1tT411g7PA/?aid=470724972&cid=766317673&page=1 点击上方链接,一分钟快速 ...

  2. .net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现

    前言 前两篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>.<.net core实践系列之短信服务-Api的SDK的实现与测试>分别讲解了AP ...

  3. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...

  4. C# 短信猫(SMS cat) 操作源码开发经验

    我曾经开发的某项目需要使用短信猫模块,要求使用C#编程操作.能独立使用的动态链接库之一就是网上流传的sms.dll,但它的功能较少,不能满足需求,鉴于一时找不到合适的完整代码,我深入研究了短信协议,借 ...

  5. 初识-Android之智能短信项目相关技术整理

    标签页切换采用传统的TabHost: 采用TabActivty实现TabHost. 效果图-后补: 相关技术详解推荐: http://blog.csdn.net/zhouli_05/article/d ...

  6. .net core实践系列之短信服务-Sikiro.SMS.Job服务的实现

    前言 本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替.但是为了说明调度任务使用实现也 ...

  7. Magicodes.Sms短信库的封装和集成

    简介 Magicodes.Sms是心莱团队封装的短信服务库,已提供Abp模块的封装. Nuget 新的包 名称 说明 Nuget Magicodes.Sms.Aliyun 阿里云短信库 Magicod ...

  8. .net core实践系列之短信服务-Api的SDK的实现与测试

    前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...

  9. atitit 短信接口规范与短信解决方案.docx

    atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...

  10. PhpSms 稳定可靠的php短信发送库

    可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...

随机推荐

  1. 【JS 逆向百例】房天下登录接口参数逆向

    声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:房天下账号密码登录 主页:https://passpo ...

  2. Natapp 邀请码 积分

    邀请码: 29F145FC 充值95折

  3. Windows 核心编程笔记 [2] 字符串

    1. ANSI 和 Unicode Windows 中涉及字符串的函数有两个版本 1)ANSI版本的函数会把字符串转换为Unicode形式,再从内部调用函数的Unicode版本 2)Unicode版本 ...

  4. SqlSugar的Where用法

    1.普通表达式查询 //id=@id var list=db.Queryable<Student>().Where(it => it.Id == id).ToList();   // ...

  5. 【3】jupyter notebook【修改主题、字体、字号、代码自动补全、变更工作目录、添加目录插件、解决工具栏隐藏问题、修改默认浏览器、默认打开位置】

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  6. MakeFile文件的使用 [补档-2023-07-13]

    makefile-gdb文件 ​ 可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译.他可以自动化编译程序.... 6-1 makefile基本规则 ​ 如下: ​ ...

  7. HarmonyOS 开发入门(一)

    HarmonyOS 开发入门(一) 日常逼逼叨 因为本人之前做过一些Android相关的程序开发,对移动端的开发兴趣比较浓厚,近期也了解到了一些关于华为HarmonyOS 4.0 的事件热点,结合黑马 ...

  8. 【奶奶看了都会】ChatGPT3.5接入企业微信,可连续对话

    1.连续对话效果 小伙伴们,这周ChatGPT放出大招,开放了GPT3.5的API.说简单点,就是提供了和ChatGPT页面对话一样模型的接口.而之前接的ChatGPT接口都是3.0,并不是真正的Ch ...

  9. Python脚本之将一个文件夹划分多个文件夹和批量创建文件夹

    import os import shutil # 要移出的文件路径 path = r"C:\old_dir" # 新创建多个文件夹的路径 new_path = r"C: ...

  10. 5 款轻松上手的开源项目「GitHub 热点速览」

    大家都忙一年了,所以今天来点轻松的吧!就是那种拿来直接用.免费看的开源项目. 开源真是一个充满惊喜的宝库,很多开源软件比收费软件还好用,比如这款开箱即用的电视直播软件:my-tv,它免费.无广告.启动 ...