前言
看见server酱和wxpusher的服务,想自己也构思搭建一个单机高并发推送服务。
构思
目前针对有服务器构思了两个方案:
- Openresty + Lua + Python + uwsgi + clickhouse + Redis(针对小、单机部署)
- Openresty + Lua + Python + uwsgi + clickhouse + Redis + Kafka(针对大规模集群部署)
无服务器方案:
API网关 + Serverless云函数服务
搭建后期可以进行容器化封装部署。
大致架构图
Openresty
高并发、Lua支持的nginx
Lua
作为少逻辑的快速响应轻量程序,还可以配合Redis实现流控效果。
Redis
初步考虑作为队列使用,使用sub/pub功能。
Python
作为处理队列的监听(或后端服务器),处理用户注册、填写token等。同时,处理队列可以分布式进行,根据kafka部署情况,部署多台队列监听程序,处理发送消息api。
Clickhouse
作为大数据数据库,用于保存用户信息,以及各种token。为了简化后端服务、数据库,使用Github OAuth进行登录。
同时,Clickhouse提供简单的http服务,可以在本地很好的配合Lua实现用户查询,无需使用复杂的业务后端。
进度更新
2022.1.10
目前搭建了Redis + Clickhouse + Flask方案,已对接企业微信推送。加上网络延迟时间,发送一条消息的速度约为1秒。
现在,正在研究对接telegram bot推送。
2022.1.11
telegram bot推送已通过测试,Markdown格式可能有点问题。
2022.1.14
目前增加了FCM推送方式,创建了简易的APP进行测试。奇怪的是,杀死app会收不到推送?
Markdown插件有个问题,URL包含@符号会自动吞掉后面字符,所以没显示图片。
2022.1.16
添加了简易的模板,展示Markdown消息内容,发送时可选保存。
2022.2.24
最近工作比较忙,更新了一下markdown模板,使用队列批量入库clickhouse。
写了一个简易的clickhouse连接池,未测试线程安全。
最后还是使用到多线程请求API,而不是协程(测试过协程速度较慢)。
之后会将高度耦合的各模块进行解耦。
2022.4.11
又来填坑了,目前发现redis 5.0有个新特性:stream的一个消息队列,可以取代pubsub持久存储,对标kafka。
如此一来,针对大集群的情况,也可以使用redis进行了。
目前代码由简单list消息队列轮询,变为使用stream阻塞查询,效率提升。
支持自定获取条数,订阅双stream消费可以同时处理入库和消息推送请求。
stream组消费存在问题:
-
使用
XACK
并不能够确认该消息已处理,重启消费者会导致重复消费; -
启动时
id
为0
时不能读取到pending的数据,必须置id
为>
。
2022.4.13
了解DFA敏感词过滤算法,找离线敏感词库。
DFA(确定有穷自动机)理论上就是一个树,类似哈夫曼树。
思考了一下,使用BERT机器学习建立一个模型来跑会不会效率更高呢?
BERT --> 检测;DFA --> 检测&过滤
2022.6.22
新增了Bark通道,测试发送速度小于1s。
2022.7.29
添加了Docker支持,使用Docker-compose一键启动。