第 10 章
会话谁来建
Ana 在新电脑上第一次登录桌面版,左边的会话列表里该有什么?会话列表是手机从收到的消息里自己拼出来,还是服务器建好、设备去同步?
这一章是初稿,会在写完前八章后再修订。
v2 的第一件事是桌面版。Ana 买了台新笔记本,第一次登录,左边的会话列表该出现什么?
她加了很多群,有 2,000 个会话(全书平均每人 200 个)。不少群很安静:家人群一个多月没人说话,老同学群快五个月了。
这些会话从哪来,取决于会话列表是谁建的。第 6 章已经在服务端给每人每个会话存了一行记录,新设备照着它就能拿全。这一章把它定成规矩,并说清楚为什么不走另一条路:让每台设备自己从消息里拼。
1. 两种建法
端上建服务端一条时间线 → 端上自己归成会话
服务端建服务端的会话 → 端上照抄成会话
- 端上建:服务端给每人一条时间线,也就是信箱信箱inbox每人一份的收件索引,记着“有哪些新消息要给你”,有自己按人递增的序号。写扩散时写它,设备从自己的位置之后拉。第 6、10 章拿它和问遍所有会话比较,本书的 v2 没有用它。在术语表里查看,发给你的每条消息按时间记一条小记录(哪个会话、第几条,32 字节)。手机把它们按会话归堆,就是会话列表。
- 服务端建:服务端给每人每个会话存一行会话记录会话记录conversation record每人每个会话一行:置顶、免打扰、这个会话的最新 seq,以后还有读到哪。进群、退群、改设置时写;从第 11 章起,来了消息也改(写上最新 seq)。每次改动给这个人的记录版本加一。消息本身不在这里。在术语表里查看,手机照抄。
2. 和扩散连在一起
端上建,离不开写扩散。 手机只能从收到的消息里知道有哪些会话,所以每条消息都得往每个收件人的时间线里追加一条,这叫写扩散写扩散write fan-out发消息时给每个接收人的信箱各写一条,读的时候只看自己的信箱。写得多、读得快,适合人数不多的会话。第 6 章拿它做比较;第 10 章说明它和端上建会话连在一起:手机要从信箱里拼出会话。v1、v2 都没有用它。在术语表里查看。徒步群 500 人,一条消息追加 500 条;一天 1,000 条消息,就是 50 万条。时间线只会越来越长,得定期清。
服务端建,消息可以只存一份。 名单在服务端,消息只放在会话里(读扩散读扩散read fan-out消息只在会话的时间线里存一份,每个人读的时候自己去取。写得少、读得多,适合大群。v1、v2 的消息都这样存(第 6、10 章);它要求会话由服务端建、设备去同步。在术语表里查看),徒步群一条消息,不用给成员写任何东西。要不要另外再给每人留一条流,是第 6 章算过的读写账,当时选了不留。
Telegram 是服务端建、又留着流的例子:会话列表由服务端给(messages.getDialogs),私聊和普通群另外共用每人一条更新序列。
3. 新电脑第一次登录
端上建,新电脑只能重放时间线:把信箱拉下来,按会话归堆。归得出多少,看信箱留了多久:
- 留得短(比如 7 天,省存储):几个月没人说话的群,时间线里没有它的记录,就归不出来。
- 一直留着:归得全,但要先把历史全拉下来。Ana 一天收 267 条,一年的记录约 3.1 MB,用得越久越大。
服务端建,新电脑照抄会话:2,000 行,用一年和用五年一样大。
一句话:时间线随消息涨,会话随会话数涨。新设备要的是会话,照抄比重放省事。
新电脑的会话列表:380 / 2,000 个会话
一格一个会话,家人群、老同学群排在最前;左上角那一串是最热闹的群,其余的都很安静
在新电脑的列表里不在家人群、老同学群家人群、老同学群,没出现
- 第一次登录下载 136 KB:重放时间线里的 1,869 条记录,再给每个会话拉最新一条
- 家人群、老同学群都不在:时间线里早就没有它们的消息了
信箱留 7 天,新电脑只归出 380 个会话,家人群、老同学群都不在。换成服务端建,2,000 个都在。
置顶、免打扰这些会话上的设置,是另一套同步逻辑,这一章不比。
4. v2 的决定
会话列表以服务端为准:服务端存会话(会话记录),每台设备照抄,本地只是副本。消息仍然只在会话里存一份。
5. 代价
存的东西没有变多,会话记录第 6 章就有。新的代价在设备上:
- 新设备第一次要拿全部会话。 每个会话一行记录加最新 seq(36 字节),再各拉最新一条消息(约 200 字节),2,000 个会话约 472 KB。可以先拉第一屏,往下翻再拉。
- 本地那份会和服务端对不上。 离线时删了一个会话,或者同步漏了一次。规矩是以服务端为准,改回来。
还没解决的是第 6 章那笔:每次同步都问遍所有会话,Ana 一次 24 KB。这是下一章的事。
6. 其他答案
- 信箱加端上建。 服务端简单,同步只有一条流、一个来回。代价是第 3 节那些:留得短归不全,留得长要重放很多历史;会话上的设置还得另外同步。
- 服务端建,也留每人一条流。 像 Telegram,私聊和小群一次拿到“上次之后的全部”。两套同步要一起维护,群从小变大还得换一种。
7. 这一章的决定
会话在服务端,几台设备都对得上了。可 Ana 每次打开手机,还是要下载 2,000 个会话的最新 seq,其中只有十来个变了。下一章:会话同步。