如何实现 Webhooks 投递系统

87 天前
 pingme

最近项目要实现一个开发者平台,我负责 Webhooks 这块,初步构想后应该会需要一个 Webhooks 系统

需求是这样的:把系统内部的事件根据用户在开发者平台订阅的事件,投递到对应的 HTTP 接口上。而且还要求能重试,后期也要允许用户在投递失败时能手动重试,而且每次重试也要有记录能看到

1006 次点击
所在节点    程序员
8 条回复
yinmin
87 天前
1. 系统有自动重试机制,5 秒、30 秒、2 分钟、5 分钟、10 分钟、30 分钟、1 小时,之后每小时自动重试一次直到 24 小时

2. 每个 webhooks 有 1 个唯一 id ( 64 位 int ),在网络不稳定的情况下,客户程序会多次接收到 webhooks ,客户程序应根据唯一 id 避免重复处理同一个 webhooks

3. 如果同一客户的传输数量条目比较多,设计 webhooks 数据包时,支持一次 https 请求能携带多条记录(最多 1 次 200 条),能大幅提升效率

4. 非金融类的,可以 https 头部携带一个 apikey 做认证;金融类的,建议基于证书做数字签名。

5. 可以基于 rabbitmq 之类的消息框架做开发
kkk9
87 天前
最好加上目标服务器 ip 白名单机制,不在白名单 ip 的全部拒绝处理,不然运维会狠狠“谢谢”你的!
julyclyde
86 天前
@kkk9 用 IP 白名单,将来迁移的时候,将来的运维会“狠狠谢谢”现在的运维
kkk9
78 天前
@julyclyde #3 你没做过吗? ip 白名单对运维是最基础的操作。况且,做 ip 白名单配合 iptables(或者安全组)可以从网络层就开始拒绝,直接杜绝了莫名其妙的大流量或者导致 cpu/ram 高
julyclyde
78 天前
@kkk9 iptables 加多了之后,绝大多数 cpu 时间都会消耗在内核 netfilter 上
然后你就会发现进程虽然并不怎么占处理器,但性能就是上不去

而且应用程序发行、升级的时候,很难对内核的状态同时进行管理
julyclyde
78 天前
@kkk9 还有个问题,就是你的通信“对方”发生变化的时候,居然你这边需要更改防火墙策略
都发生严重的跨系统耦合了!!
kkk9
78 天前
@julyclyde #6 对,你说的对,哈哈哈哈哈哈
hiyyq3372
77 天前
把 IP 白名单外包给云主机厂商

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1066198

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX