如何实现 Webhooks 投递系统 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
pingme
V2EX    程序员

如何实现 Webhooks 投递系统

  •  1
     
  •   pingme 2024-08-19 17:03:20 +08:00 1543 次点击
    这是一个创建于 494 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    • 在设计 Webhooks 系统时,有哪些最佳实践?
    • 怎么确保 Webhooks 的安全性,比如防止恶意攻击
    • 有什么框架或者中间件可以实现?
    8 条回复    2024-08-29 21:46:06 +08:00
    yinmin
        1
    yinmin  
       2024-08-19 18:13:41 +08:00 via iPhone   2
    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
        2
    kkk9  
       2024-08-19 21:38:17 +08:00   1
    最好加上目标服务器 ip 白名单机制,不在白名单 ip 的全部拒绝处理,不然运维会狠狠“谢谢”你的!
    julyclyde
        3
    julyclyde  
       2024-08-20 13:06:39 +08:00
    @kkk9 用 IP 白名单,将来迁移的时候,将来的运维会“狠狠谢谢”现在的运维
    kkk9
        4
    kkk9  
       2024-08-28 08:17:13 +08:00
    @julyclyde #3 你没做过吗? ip 白名单对运维是最基础的操作。况且,做 ip 白名单配合 iptables(或者安全组)可以从网络层就开始拒绝,直接杜绝了莫名其妙的大流量或者导致 cpu/ram 高
    julyclyde
        5
    julyclyde  
       2024-08-28 09:59:26 +08:00
    @kkk9 iptables 加多了之后,绝大多数 cpu 时间都会消耗在内核 netfilter 上
    然后你就会发现进程虽然并不怎么占处理器,但性能就是上不去

    而且应用程序发行、升级的时候,很难对内核的状态同时进行管理
    julyclyde
        6
    julyclyde  
       2024-08-2 10:02:05 +08:00
    @kkk9 还有个问题,就是你的通信“对方”发生变化的时候,居然你这边需要更改防火墙策略
    都发生严重的跨系统耦合了!!
    kkk9
        7
    kkk9  
       2024-08-28 20:36:59 +08:00
    @julyclyde #6 对,你说的对,哈哈哈哈哈哈
    hiyyq3372
        8
    hiyyq3372  
       2024-08-29 21:46:06 +08:00
    把 IP 白名单外包给云主机厂商
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2666 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:35 PVG 19:35 LAX 03:35 JFK 06:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86