menu LittleJake's Blog
color_lens
avatar
Jake Liu
Never Settle
creative commons by-nc-sa
hit
Category
keyboard_arrow_down

© 2024 LittleJake's Blog.

萌ICP备20223020号

(挖坑)搭建消息推送api

前言

看见server酱和wxpusher的服务,想自己也构思搭建一个单机高并发推送服务。

构思

目前针对有服务器构思了两个方案:

  1. Openresty + Lua + Python + uwsgi + clickhouse + Redis(针对小、单机部署)
  2. Openresty + Lua + Python + uwsgi + clickhouse + Redis + Kafka(针对大规模集群部署)

无服务器方案:
API网关 + Serverless云函数服务

搭建后期可以进行容器化封装部署。

大致架构图

flowchart LR; A[Openresty]--->B[UWSGI]--->C[Python]<-->D[(ClickHouse)] C<-->E[(Redis)] A<--Lua-->D

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推送。

telegram bot推送

2022.1.11

telegram bot推送已通过测试,Markdown格式可能有点问题。

telegram bot推送

2022.1.14

目前增加了FCM推送方式,创建了简易的APP进行测试。奇怪的是,杀死app会收不到推送?

FCM服务端

FCM通知

Markdown插件有个问题,URL包含@符号会自动吞掉后面字符,所以没显示图片。

FCM客户端

2022.1.16

添加了简易的模板,展示Markdown消息内容,发送时可选保存。

Markdown消息页面

2022.2.24

最近工作比较忙,更新了一下markdown模板,使用队列批量入库clickhouse。

写了一个简易的clickhouse连接池,未测试线程安全。

wxwork

最后还是使用到多线程请求API,而不是协程(测试过协程速度较慢)。

请求时间

之后会将高度耦合的各模块进行解耦。

2022.4.11

又来填坑了,目前发现redis 5.0有个新特性:stream的一个消息队列,可以取代pubsub持久存储,对标kafka。

如此一来,针对大集群的情况,也可以使用redis进行了。

目前代码由简单list消息队列轮询,变为使用stream阻塞查询,效率提升。

flowchart LR; A[生产者]--->B[Redis Stream]<--->C[消费者]--->D[入库线程] C--->E[推送消息线程] E--入库消息-->B

支持自定获取条数,订阅双stream消费可以同时处理入库和消息推送请求。

stream组消费存在问题:

  1. 使用XACK并不能够确认该消息已处理,重启消费者会导致重复消费;

  2. 启动时 id0 时不能读取到pending的数据,必须置 id>

2022.4.13

了解DFA敏感词过滤算法,找离线敏感词库。

DFA(确定有穷自动机)理论上就是一个树,类似哈夫曼树。

思考了一下,使用BERT机器学习建立一个模型来跑会不会效率更高呢?

BERT --> 检测;DFA --> 检测&过滤

2022.6.22

新增了Bark通道,测试发送速度小于1s。

发送窗口

Bark

2022.7.29

添加了Docker支持,使用Docker-compose一键启动。

Buy me a beer

buymeacoffee
Jake Liu
Never Settle

Title: (挖坑)搭建消息推送api

Author: Jake Liu

Origin:

Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) For any re-post you must give appropriate credit.

文章遵循CC许可 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请注明出处

Tag:openresty, python, ClickHouse, server酱, 消息推送

评论区

Add a new comment.

Theme