Skip to content

Latest commit

 

History

History
258 lines (206 loc) · 24.4 KB

README.md

File metadata and controls

258 lines (206 loc) · 24.4 KB

实时通讯 架构暡板

代衚产品:WhatsApp、埮信、Slack、各类 IM / 矀聊 䞀句话定䜍:让䞀条消息又快、又䞍䞢、又有序地从䞀䞪人到蟟及䞀䞪人(或䞀矀人)。


1. 䞀句话定䜍

䞀䞪实时通讯产品 = 䞀匠「氞远圚线的消息投递眑」:几癟䞇、䞊千䞇人同时挂着䞀条「随时胜收到掚送」的长连接,系统芁保证任䜕人发出的每䞀条消息,郜尜快、䞍䞢、按正确顺序送到该收的人手里——对方圚线就立刻送蟟,䞍圚线就先存奜、等他䞊线再补。

架构䞊最反盎觉的䞀点:隟点䞍圚「发」,而圚「绎持海量长连接」和「保证投递的可靠䞎有序」。䞀条消息埈小,䜆「让千䞇条持久连接同时挂着、还胜粟准扟到芁把消息掚给哪条连接」,以及「圚眑络随时䌚断的现实里做到䞍䞢、䞍重、䞍乱序」,䌚把敎套架构逌向有状态连接、序号、确讀重试这些栞心机制。

2. 䞚务本莚:它圚解决什么问题

甚户芁的是**「我发的消息,对方埈快就胜看到;对方发的,我立刻就收到;䞀条郜䞍胜䞢、顺序还䞍胜乱」。它取代的是「打电话/发邮件」那种芁么打断、芁么埈慢的沟通——IM 提䟛的是即时、匂步、有记圕**的连续对话。

价倌䞎钱从哪来:

  • 粘性䞎眑络效应:䜠的关系铟郜圚这,迁移成本极高,这是最区的技城河;
  • 䌁䞚版 / 团队协䜜(劂 Slack):按垭䜍订阅,卖的是团队沟通效率;
  • 增倌:衚情、䌚员、䌁䞚服务、平台生态。

关键事实:这类系统的莟蜜圢态是「海量并发的持久连接 + 持续的小消息流」,而䞍是「短平快的请求-响应」。 普通眑站的连接「来了就走」,这里的连接「来了就䞀盎挂着」。这䞀条决定了䞺什么「长连接眑关」「连接是有状态的」「怎么扟到该把消息掚给哪台机噚䞊的哪条连接」䌚成䞺架构的栞心呜题。

3. 栞心需求䞎纊束

功胜性需求(系统芁胜做什么):

  • 发送 / 接收消息:䞀对䞀、䞀对倚(矀)。
  • 实时送蟟:对方圚线时,消息近乎瞬闎到蟟。
  • 犻线消息:对方䞍圚线时,消息䞍䞢,䞊线后补霐。
  • 消息有序:同䞀䌚话里,消息按发送顺序呈现。
  • 可靠投递:䞍䞢、䞍重(发出去的最终郜到、䞔只呈现䞀次)。
  • 圚线状态(Presence):星瀺对方圚线/犻线/正圚蟓入。
  • 矀组:成员管理 + 矀消息扩散到每䞪成员。
  • 倚媒䜓:发囟片、语音、文件。
  • 倚端同步:手机、电脑同时圚线,消息和已读状态䞀臎。

非功胜性需求 / 莚量属性(这才是架构的䞻战场):

莚量属性 目标 䞺什么对这类系统重芁
消息时延 圚线时 < 几癟毫秒 IM 的灵魂就是「即时」,慢了就䞍叫即时通讯。
可靠投递 䞍䞢、䞍重 䞢䞀条重芁消息=信任厩塌。这是底线。
消息有序 单䌚话内䞥栌有序 顺序乱了对话就读䞍懂(「奜啊」出现圚「芁䞍芁吃饭」之前)。
海量并发连接 癟䞇~千䞇级长连接 连接数是这类系统独有的栞心规暡指标。
可甚性 99.9%+ 连䞍䞊=甚䞍了,甚户立刻焊虑。
圚线状态实时性 最终䞀臎即可 状态变化极频繁,允讞短暂䞍准——这是宝莵的「束匛空闎」。

关键纊束(䞍可速越的蟹界):

  • 🔎 长连接是「有状态」的。䞀条连接物理䞊挂圚某䞀台眑关机噚䞊,系统必须知道「某甚户歀刻连圚哪台机噚」才胜把消息掚给他。这䞎无状态 Web 服务的扩展方匏完党䞍同,是倎号纊束。
  • 🔎 眑络䞍可靠。连接随时䌚断、消息可胜䞢、可胜重发,可靠䞎有序必须靠应甚层机制(序号、确讀、重试、去重)自己保证。
  • 🔎 倧矀扩散:䞀条消息发进䞇人倧矀,芁觊蟟每䞪成员——这又是䞀䞪「扇出」问题,和瀟亀信息流的倧 V 问题同源。
  • 消息写入量倧䞔持续:每条消息郜芁持久化以支持犻线/历史/倚端。

4. 架构党景囟

   发送方(手机/电脑,挂着长连接)                    接收方(圚线 / 犻线)
        │  ① 发消息                                        ▲
        â–Œ                                                  │ â‘€ 掚送(圚线时)
┌──────────────────────────────────────────────────────────────────────┐
│  长连接眑关层(有状态:每台机噚挂着䞀批持久连接)                          │
│  眑关A           眑关B           眑关C   ...  (氎平扩展,可挂癟䞇级连接) │
└────┬───────────────────────────────────────────────┬──────────────────┘
     │ ② 䞊行消息                                      ▲ ④ "掚给甚户U" → 查路由
     â–Œ                                                │   → 扟到U连圚眑关C → 投递
┌────────────────────┐         查询/曎新               │
│  消息服务(栞心)     │ ◀──── 甚户↔眑关 路由衚 ────────┘
│  • 分配䌚话内序号    │       (甚户U 歀刻连圚 眑关C)
│  • 持久化消息        │              ▲
│  • 刀断收方圚/犻线    │              │ 连接建立/断匀时曎新
│  • 圚线→投递 / 犻线→存│
└───┬──────────┬───────┘
    │          │ ③ 写入                       犻线分支
    │          â–Œ                          ┌────────────────────┐
    │   ┌──────────────┐                  │ 犻线消息存傚          │
    │   │ 消息存傚      │                  │ + 犻线掚送服务        │
    │   │ (持久/有序)  │                  │ (唀起厂商掚送通道)   │
    │   └──────────────┘                  └────────────────────┘
    │                                        ▲ 收方䞊线后来拉取
    │ 矀消息扩散
    ▌
┌──────────────┐   ┌────────────────┐   ┌──────────────────────────────┐
│ 矀组/成员服务 │   │ 圚线状态服务     │   │ 媒䜓存傚                       │
│ (扇出到成员) │   │ (presence,     │   │ (囟/语音/文件,只䌠匕甚)      │
│              │   │  最终䞀臎)      │   │                              │
└──────────────┘   └────────────────┘   └──────────────────────────────┘

灵魂郚件是䞀块:「长连接眑关层」(有状态地挂着海量持久连接)和它䟝赖的**「甚户↔眑关路由衚」(芁把消息掚给某人时,先查到他歀刻连圚哪台眑关)。敎套系统的栞心机制郜囎绕这䞀点,以及消息服务里的「序号(保序)+ 持久化(䞍䞢)+ 圚线/犻线分流」**展匀。

5. 组件职莣

  • 长连接眑关层:绎持海量客户端的持久连接,做心跳保掻,䞊行收消息、䞋行掚消息。它是有状态的——每条连接物理绑定圚某台眑关䞊。䞺什么需芁:实时掚送芁求服务端胜䞻劚扟到客户端并掚过去,这只胜靠䞀盎挂着的连接;蜮询既慢又莹。它是这类系统区别于普通 Web 的根本所圚。
  • 甚户↔眑关路由衚:记圕「某甚户歀刻连圚哪台眑关机噚䞊」。连接建立/断匀时曎新。䞺什么需芁:连接有状态,芁把消息投给甚户 U,必须先知道 U 连圚哪,才胜把投递指什发到那台眑关。这是有状态连接埗以氎平扩展的关键拌囟。
  • 消息服务(栞心):䞺每条消息圚䌚话内分配单调递增序号(保序),持久化消息(䞍䞢),刀断收方圚线䞎吊并分流(圚线盎接投递、犻线蜬存 + 觊发掚送)。䞺什么需芁:可靠䞎有序䞍胜靠眑络自垊,必须由这䞀层甚序号、萜库、确讀来保证;它是消息流蜬的䞭枢。
  • 消息存傚:持久保存消息,支持犻线补霐、历史回溯、倚端同步。写倚、按䌚话有序读。䞺什么需芁:消息䞍胜只掻圚内存/连接里,吊则䞀断线就䞢;持久化是「䞍䞢」和「倚端䞀臎」的基础。
  • 犻线消息存傚 + 犻线掚送服务:收方䞍圚线时,消息存进他的「犻线信箱」,并通过系统级掚送通道唀醒对方;䞊线后他来拉取补霐。䞺什么需芁:甚户倧量时闎䞍圚线,必须保证「人䞍圚也䞍䞢、回来胜补䞊」。
  • 矀组 / 成员服务:绎技矀成员关系,矀消息芁扇出到每䞪成员。䞺什么需芁:矀消息本莚是「䞀条消息芁投递给 N 䞪收方」,这是䞪扇出问题(和瀟亀信息流的倧 V 同源),倧矀尀其芁小心。
  • 圚线状态服务(Presence):绎技圚线/犻线/正圚蟓入等状态。䞺什么需芁:瀟亀䞎场感的关键。䜆状态变化极频繁,最终䞀臎即可——晚䞀䞀秒䞍臎呜。
  • 媒䜓存傚:囟片/语音/文件存对象存傚,消息里只垊匕甚(地址),䞍把字节塞进消息流。䞺什么需芁:倧文件䞍胜挀占蜻量、芁求䜎时延的消息通道,分匀䌠蟓。

6. 关键数据流

场景䞀:䞀对䞀发消息,收方圚线(最栞心的实时路埄)

1. 发送方(连圚 眑关A) ── ① 发消息 ──▶ 眑关A ── ② 䞊行 ──▶ 消息服务
2. 消息服务:
       a. 给这条消息分配【䌚话内序号 seq=N】(保证顺序)
       b. 持久化这条消息(写入消息存傚)         ← 先萜库,保证䞍䞢
       c. 查【路由衚】:收方 U 歀刻连圚 眑关C,䞔圚线
3. 消息服务 ── ④ "投递给U" ──▶ 眑关C ── â‘€ 掚送 ──▶ 收方屏幕
4. 收方收到后回䞀䞪【ack(收到了 seq=N)】
5. 没收到 ack → 消息服务按策略重试投递;收方靠 seq 去重(重倍的䞢匃)

泚意:先萜库、再投递(䞍䞢);䌚话内单调序号(有序);ack + 重试 + 按序号去重(可靠䞔䞍重)。可靠投递的䞉件套党圚这条路埄里。

场景二:收方犻线(存 + 掚 + 䞊线补霐)

1~2. 同䞊,消息服务萜库、查路由衚 ── 发现收方 U 䞍圚线(没有掻劚连接)
3. 消息服务:把消息写入 U 的【犻线信箱】
4. ──▶ 犻线掚送服务:通过系统级掚送通道,给 U 的讟倇发䞀条唀醒掚送
5. (䞀段时闎后)U 打匀 App、建立长连接 ──▶ 眑关曎新路由衚(U 现圚连圚 眑关B)
6. U 䞊线后䞻劚【拉取犻线信箱】里 seq 倧于"我已收到的最倧序号"的所有消息
7. 按 seq 排奜序呈现 → 䞀条䞍少、顺序正确

泚意第 6 æ­¥:靠「我已收到的最倧序号」做断点续䌠匏拉取,既䞍挏也䞍重——序号圚这里同时解决了「补霐」和「去重」。

场景䞉:矀消息扩散(扇出问题)

某人圚矀里发䞀条消息 ──▶ 消息服务(分配该矀䌚话的序号、萜库䞀次)
   ──▶ 矀组服务:取出矀成员列衚
   ──▶ 对每䞪成员:圚线的 → 查路由衚投递;犻线的 → 进各自犻线信箱 + 掚送
   
   小矀:盎接逐䞪扇出,没问题。
   䞇人倧矀:䞀条消息瞬闎芁觊蟟䞊䞇人 → "扇出爆炞"(同瀟亀流的倧V问题)
      ✅ 倧矀䌘化:消息只存"䞀仜共享的矀消息流",成员各自绎技"读到哪了"的䜍点,
                  䞊线/圚矀内时按䜍点来拉,而非给每人郜掚䞀仜/存䞀仜。

倧矀扩散和瀟亀信息流的「倧 V 写扩散爆炞」是同䞀䞪问题:郜是「䞀次写芁觊蟟海量接收方」。砎解思路也同源——别给每人郜拷䞀仜(写扩散),改成共享䞀仜、各自按䜍点来拉(读扩散)。

7. 数据暡型䞎存傚选择

栞心实䜓:甚户;䌚话(䞀对䞀 / 矀);消息(message,垊䌚话内序号 seq);甚户↔眑关 路由(谁连圚哪);䌚话成员关系;圚线状态;已读䜍点。

数据 存傚类型 䞺什么
消息(持久) 有序远加存傚(按䌚话分片) 写倚、按䌚话有序读、芁支持犻线补霐䞎历史;序号倩然适合远加
甚户↔眑关 路由衚 内存级 KV 极高频读写(每条消息投递郜芁查)、芁极䜎延迟、连接变劚频繁
圚线状态(presence) 内存级 KV(垊过期) 变化极频繁、读频繁、可最终䞀臎,适合垊 TTL 的高速猓存
犻线信箱 KV / 有序队列(按甚户) 按甚户存埅收消息,䞊线后按序号拉取
䌚话 / 矀成员关系 关系型 / 宜列 成员管理芁䞀臎;倧矀成员列衚可胜埈长
媒䜓(囟/语音/文件) 对象存傚 文件倧、䞍可变;消息里只存匕甚
甚户莊户 关系型 芁事务、区䞀臎(莊号安党)

教孊点:消息流和「连接路由衚」是䞀类访问圢态完党䞍同的数据。 消息芁持久、有序、可回溯,适合有序远加存傚;路由衚芁的是「每次投递郜极速查䞀䞋 U 连圚哪」,是兞型的内存级 KV。甚「内存级 KV」描述路由衚䞎 presence,是因䞺它们的访问圢态是「超高频、䜎延迟、可接受最终䞀臎」,䞎具䜓产品无关。 把路由衚攟进慢速持久库,䌚让每条消息的投递郜被拖慢。

8. 关键架构决策䞎权衡 ⭐

决策 1:长连接怎么绎持䞎氎平扩展?(本架构的呜闚)

  • 问题根源:长连接是有状态的——䞀条连接物理挂圚某台眑关机噚䞊。无状态 Web 服务「随䟿哪台机噚郜胜倄理任意请求」的扩展方匏圚这里倱效了,因䞺「芁把消息掚给 U」必须送到「U 实际连着的那台机噚」。
  • 选项 A(单机/纵向):䞀台超区机噚挂所有连接。简单,䜆连接数有物理倩花板,䞔单点故障=党员掉线。
  • 选项 B(氎平扩展 + 路由层):倚台眑关分担连接,倖加䞀匠甚户↔眑关路由衚记圕「谁连圚哪」;投递时先查路由、再把消息送到对应眑关。
  • 取向:必然走 B。代价是:① 倚了䞀层路由衚,䞔它芁随连接的建立/断匀实时曎新(高频写);② 投递路埄倚䞀跳查询;③ 眑关机噚故障时,其䞊所有连接芁胜重连并刷新路由。「把有状态的连接 + 䞀匠‘状态圚哪’的路由衚」组合起来,是让有状态服务氎平扩展的通甚套路——它把「状态绑定」䞎「按状态路由」星匏分犻了出来。

决策 2:消息时序怎么保证?

  • 靠到蟟时闎排序:眑络抖劚、重发䌚让到蟟顺序≠发送顺序,乱序。
  • 靠䌚话内单调递增序号:每条消息圚其所属䌚话里拿䞀䞪递增的 seq,接收端按 seq 排序呈现,而非按到蟟顺序。
  • 取向:甚单调序号保序,䞔保序的范囎限定圚「单䞪䌚话内」(䞍需芁党局有序——党局有序代价极高䞔没必芁,䜠只关心「这䞪对话里的顺序」)。代价是芁有䞀䞪「䞺某䌚话发号」的机制(䞔芁避免它成䞺瓶颈,通垞按䌚话分片发号)。「圚真正需芁顺序的最小范囎内保序」——这是䞪关键的范囎收敛智慧。

决策 3:可靠投递(䞍䞢、䞍重)怎么做?

  • 发出去就䞍管:最简单,䜆眑络䞀抖就䞢消息,违背底线。
  • 确讀 + 重试 + 幂等去重:① 收方收到后回 ack;② 发送䟧没收到 ack 就重试;③ 重试䌚富臎重倍,所以接收䟧靠 seq / 消息 ID 去重(同䞀条只呈现䞀次)。再叠加「先持久化、再投递」保证即䜿投递倱莥,消息也没䞢、可重投。
  • 取向:䞉件套(ack + 重试 + 去重)猺䞀䞍可,因䞺重试和去重是䞀对——䜠䞺了「䞍䞢」而重试,就必然匕入「重倍」,于是必须去重。代价是协议变倍杂、每条消息芁垊 ID/seq、芁绎技 ack 状态。「至少䞀次投递 + 幂等去重 = 恰奜䞀次的效果」,这是分垃匏投递的经兞组合。

决策 4:矀消息扩散——写扩散还是共享读取?

  • 写扩散(给每䞪成员各投/各存䞀仜):小矀埈自然、读时简单。䜆倧矀爆炞——䞇人矀䞀条消息瞬闎产生䞊䞇次投递/存傚。
  • 共享读取(只存䞀仜矀消息流,成员各记「读到哪」):写极蜻(存䞀仜),成员按已读䜍点来拉。倧矀友奜,䜆读时芁按䜍点聚合。
  • 取向:小矀写扩散、倧矀共享读取(和瀟亀流「普通人掚、倧 V 拉」同构)。代价是系统里同时存圚䞀套矀消息倄理路埄。这再次印证:任䜕「䞀次写觊蟟海量接收方」的扇出问题,解法郜圚‘拷莝䞀仜 vs 共享䞀仜按需拉’之闎权衡。

决策 5:圚线状态(presence)芁倚准?

  • 区䞀臎、实时粟确:状态变化极频繁(每次切前后台、断眑、心跳郜变),区䞀臎代价极高,䞔没必芁。
  • 最终䞀臎 + 高速猓存 + 过期:状态写进垊 TTL 的内存级 KV,允讞短暂䞍准(对方刚䞋线䜠可胜还星瀺圚线䞀䞀秒)。
  • 取向:最终䞀臎足矣。presence 是兞型的「可以䞍那么准」的数据,把它圓区䞀臎来做是巚倧的浪莹。识别出「哪些数据允讞短暂䞍准」,胜省䞋倧量成本——这是宝莵的讟计自由床。

9. 规暡化䞎瓶颈

和普通系统䞍同:这里的倎号瓶颈是「长连接数」和「连接路由」,其次才是消息写入䞎倧矀扩散。

  • 第䞀䞪瓶颈:长连接数。 单机胜挂的持久连接有䞊限,甚户䞀倚就觊顶。 ç Žè§£:① 眑关氎平扩展(倚台分担连接);② 连接路由层(甚户↔眑关路由衚)让消息胜扟到对应眑关;③ 就近接入、连接莟蜜均衡。
  • 第二䞪瓶颈:倧矀扩散。 䞀条消息芁觊蟟海量成员。 ç Žè§£:倧矀共享读取(读扩散)+ 已读䜍点拉取,而非给每人掚/存䞀仜(决策 4)。
  • 第䞉䞪瓶颈:消息存傚写入量。 每条消息郜芁萜库,量极倧䞔持续。 ç Žè§£:① 按䌚话分片(把写入压力打散);② 冷消息園档到曎廉价的存傚层;③ 写入路埄匂步化、批量化。
  • 第四䞪瓶颈:路由衚 / presence 的高频读写。 每次投递查路由、状态频繁变曎。 ç Žè§£:攟内存级 KV、按甚户分片、presence 甚最终䞀臎 + TTL 降䜎写压。
  • 媒䜓流量:囟/语音/文件走对象存傚 + (必芁时)CDN,䞍挀占消息通道。

10. 安党䞎合规芁点

  • 端到端加密(取决于产品定䜍):像 WhatsApp 这类区隐私定䜍的产品,消息圚䞀端加解密,服务噚只蜬发密文、看䞍到内容。这是最区的隐私承诺,䜆代价是:服务端无法做内容审栞、无法圚服务端做党文搜玢、倚端同步密钥管理倍杂。是吊䞊 E2EE 是䞀䞪产品级取舍。
  • 消息隐私䞎最小留存:消息是高床敏感数据,芁做䌠蟓䞎存傚加密、访问控制、明确的留存䞎删陀策略。
  • 䌠蟓加密:即䟿䞍做端到端,客户端到服务噚的铟路也必须加密。
  • 滥甚䞎垃土消息:防骚扰、防垃土、防批量拉矀,需芁风控䞎限流。
  • 元数据隐私:即䟿消息内容加密,「谁和谁圚䜕时聊」这类元数据本身也敏感,芁尜量少留、䞥控。
  • 矀䞎权限:谁胜进矀、谁胜看历史消息,权限芁圚服务端区制,䞍胜只靠客户端隐藏。

11. 垞见误区 / 反暡匏

  • ❌ 甚蜮询代替长连接 → ✅ 蜮询芁么慢(闎隔长)、芁么莹(闎隔短狂打服务噚),郜做䞍到真正实时。实时掚送芁靠长连接。
  • ❌ 䞍分配序号,按到蟟顺序展瀺 → ✅ 眑络抖劚/重发必然乱序。甚䌚话内单调序号保序。
  • ❌ 䞍做去重,重试富臎消息重倍 → ✅ 䞺「䞍䞢」而重试必然垊来重倍,必须靠 seq/消息 ID 幂等去重。
  • ❌ 发出去就䞍管,䞍做 ack/重试 → ✅ 眑络䞀抖就䞢。ack + 重试 + 先萜库再投递才胜䞍䞢。
  • ❌ 倧矀同步写扩散 → ✅ 䞇人矀䞀条消息瞬闎䞊䞇次投递,卡死。倧矀改共享读取 + 䜍点拉取。
  • ❌ 把连接圓无状态、随意路由 → ✅ 连接是有状态的,必须有路由衚知道甚户连圚哪,吊则消息掚䞍到人。
  • ❌ presence 圓区䞀臎来做 → ✅ 状态变化极频繁,最终䞀臎足借,区䞀臎是巚倧浪莹。
  • ❌ 把媒䜓字节塞进消息流 → ✅ 倧文件挀占䜎时延消息通道,应存对象存傚、消息里只垊匕甚。

12. 挔进路线:MVP → 成长期 → 成熟期

阶段 甚户/规暡量级 架构长什么样 歀时该操心什么
MVP 验证想法 / 几䞇甚户 单机长连接(或简单蜮询)+ 单䞀消息存傚;序号、ack、犻线信箱的基本机制先有;无倧矀䌘化 先把「实时、䞍䞢、有序」的基本盘做对,连接郜圚䞀台机噚䞊还撑埗䜏
成长期 癟䞇级连接 分垃匏长连接眑关 + 路由衚;犻线消息存傚 + 犻线掚送;消息存傚按䌚话分片;presence 甚高速猓存 长连接氎平扩展、连接路由、可靠投递圚分垃匏䞋䟝然成立;盯䜏第䞀批倧矀
成熟期 千䞇级连接 / 海量消息 倧矀䌘化(共享读取+䜍点) + 倚掻/倚区域 + 就近接入 + 完善的倚端同步 + (按定䜍)端到端加密 + 风控合规 倧矀扇出、连接规暡、容灟倚掻、消息存傚成本、隐私䞎合规

13. 可倍甚芁点

  • 💡 有状态服务靠「状态绑定 + 路由衚」来氎平扩展。 长连接挂圚某台机噚䞊,就甚䞀匠「状态圚哪」的路由衚来定䜍它。任䜕有状态资源(䌚话、连接、分片䞻副本)的扩展,郜可借鉎这种「把状态绑定䞎按状态路由星匏分犻」的套路。
  • 💡 圚「真正需芁顺序的最小范囎」内保序,别远求党局有序。 单䌚话内甚序号保序就借,党局有序代价高䞔无意义。范囎收敛是性胜䞎倍杂床的关键。
  • 💡 至少䞀次投递 + 幂等去重 = 恰奜䞀次的效果。 重试(防䞢)䞎去重(防重)是䞀对孪生机制——任䜕「䞍可靠信道䞊芁可靠送蟟」的场景郜适甚,从消息到支付回调到事件投递。
  • 💡 「䞀次写觊蟟海量接收方」氞远是扇出问题,解法圚「各拷䞀仜 vs 共享䞀仜按需拉」之闎。 倧矀扩散、瀟亀倧 V、广播通知,本莚同源,可套同䞀套权衡。
  • 💡 识别「允讞䞍那么准/䞍那么实时」的数据,把它降级倄理。 presence 甚最终䞀臎省䞋倧量成本。哪里胜束匛,哪里就胜换来匹性䞎省钱。
  • 💡 先萜库、再投递。 把「持久化」攟圚「送出」之前,是「䞍䞢」的根基——这条次序原则圚任䜕芁求可靠的写-投递铟路里郜成立。

🎯 随堂检验


参考原型䞎延䌞阅读

本暡板基于以䞋官方工皋博客敎理。

📖 工皋博客:


📌 䞀句话记䜏实时通讯:它䞍是「胜发消息的眑站」,而是「䞀匠氞远圚线的消息投递眑」——栞心隟点是『绎持海量有状态长连接 + 圚䞍可靠眑络䞊做到䞍䞢、䞍重、䞍乱序』,所有架构机制(眑关路由、序号、ack/重试/去重、犻线存掚)郜圚䞺这䞀件事服务。