920Telegram被鳖事件之_今夜我们都是迈阿密人!

写在前面:这篇是千千跳票了半个月才拖拖拉拉写完的(期间经历了搬家、以及每天去医院和每天 ingress 签到),在医院无聊时候把这些有趣的东西记录下来,通 篇 毫 无 技 术,所以 tags 打上的是【wwy讲故事】、categories 是【千千生活随笔】。感谢看完的每一位。同样感谢被 RSS bot 打扰的订阅千千博客的每一位朋友。

正文

918 P站被墙刚刚过去两天,iOS 11 正式版终于来了。然而9.20这天发生了一件更有趣的事情-telegram 又双叒叕大范围吃鳖啦。大概当日下午 3:35 持续到傍晚 5:13,大部分亚洲用户、少部分澳洲等其他地区用户 telegram 出现一直 connecting 无法刷新讯息的情况。

3点40多的时候 tyan 在 QQ 与我讲“自己前一秒还在调试 tg bot 后一秒就炸掉,换了几个梯子都无济于事”;与此同时饼饼彼得 tg 群里转述雨少也在用 WeChat 问他同样的事。我们观察到,此时所有的群都安静了起来,消息定格住了,仿佛时间凝固一般,好享受这种静谧安详。

  • 带着困惑,遇到这种突发情况,当然是看官推啦。官推解释道大概是说新加坡集群主交换机挂了,原因是数据中心遭遇大停电。似乎并没有什么有价值的东西。然而彼得群里面,饼饼、三叶、彼得、wbcl、我 五个人存活确认,这是怎么回事呢?

结合这次实际情况看,正如我们所知道的,telegram 在第一次被注册的时候,会给每一位用户分配一个 data center(DC),为了检查自己的 DC 在哪里,我们可以使用这位台湾高中生作者的 inline bot 。只用输入@Sean_Bot info,就会返回 DC 位置,我这边返回了 My Data Center is DC1 (Miami, FL, US) ,而上文提到的存活确认的另外四个人也都在美国佛罗里达州迈阿密。相反地,其他中文圈用户在事后查得返回结果 My Data Center is DC5 (Singapore, Asia) 。这样,反观官方推特给的解释,事情就很吻合了,DC1相安无事,DC5遭殃。

那么这里又有疑惑了,同样是中文圈 tg 用户,大家 DC 不统一,telegram 是怎么分配的呢?这时候就出现了好多传言:

  • 号码归属说:根据用户注册的手机号的归属地来分配 DC。(可是这种马上被否决了,周围有一万个朋友 +86 ->DC1、+1 ->DC5)
  • 梯子说:根据梯子来判定。(没说到点子上,DC 又不会跳来跳去的啊)
  • 目前最靠谱的是彼得在 tuna 群里说的 “是第一次注册使用的IP”决定的。国内用户大概就是代理后的 IP 吧。(实验:自己拿小号用美国梯子注册,果然得到期望值 DC1)
  • 最后千千询问了@Sean_Bot作者,他有回答:剛剛聽 Kai 說每個人上傳的 Data Center 不一樣,在註冊時會自動選擇最快的,之後就不再改變了。我們在註冊時很可能被認為新加坡 DC5 最快,就算實際上美國 DC1 更快,但也不會再改變了。(看起来作者也是新加坡(小声
  • 顺带一提,DCs 貌似是被区分为5个地方的
    • DC1 美国佛罗里达州迈阿密
    • DC2 美国加利福尼亚州洛杉矶
    • DC3 荷兰首都阿姆斯特丹
    • DC4 也是阿姆斯特丹
    • DC5 亚洲新加坡

总之……应该了解一二了,没有官方说明之前,大家心里有各自的判断就好啦……

发散思维

囫囵吞枣地了解这些之后,回想起那天有些群可以发消息(比如彼得群、tuna 群),有些群鸦雀无声消息发送失败被加入队列(比如#archlinux-cn-offtopic),不难猜想到: tg 群也是被绑定了地区的,群正是 跟随者群主 DC ,屡试不爽。但是 bot 由于直接调 HTTPS API 而不受限制,没被绑定地区。可惜凭借着这个思路推广到 channel,貌似不能解释通( private channel,public channels,CDN DCs……太多讲究千千我智商跟不上了……大佬欢迎了解的大佬们在文章下面留言)。

链接

找了一圈,tg 官方对 DC 的说明大部分在 https://core.telegram.org/api/datacenter 里面。
引用一部分,真是让人捉摸不透orz

The client does not yet know which DC it will be associated with; therefore, it establishes an encrypted connection to a random address and sends its query to that address.
Having received a phone_number from a client, we can find out whether or not it is registered in the system. If it is, then, if necessary, instead of sending a text message, we request that it establish a connection with a different DC first (PHONE_MIGRATE_X error).
If we do not yet have a user with this number, we examine its IP-address. We can use it to identify the closest DC. Again, if necessary, we redirect the user to a different DC (NETWORK_MIGRATE_X error).

However, in the future, during prolonged communication from an unusual location, we may decide that the user’s data must be moved to a different DC. After some time, the data will be copied and the association will be updated. Once this happens, when executing any query transmitted to the old DC, the API will return the USER_MIGRATE_X error. The client will then have to establish a connection with the new DC and repeat the query.

后话

9.20之后 telegram 的亚服似乎还有“余震”:

  • 9.26又发生了同样的事情。
    坏蛋怎么 UPS 也坏的

  • 而9.30那天 DC5 亚服和 DC1 美服之间断了,tg 被局域……借用欣欣发的图一目了然(图都被我压绿了

  • 10.11Telegram 4.4 版更换/新增新加坡服务器节点,端口25变成5222

  • ……
  • 期待 telegram 会更好

end