[Chat Service] MessageService找到receiver的WebSocket Server

今天面试面到了这个……然后面试官对把user_id到Websocket IP address + connection object的mapping存起来用于寻找很不认同。主要是websocket server一挂,所有和这个websocket server关联的那些data都失效了,如果重连之前很可能deliver不到相应的client 或者deliver到出错的client

比如user Alice - websocket server 1 - connect object 1
websocket server 挂了 但是这条记录还存着

我的回答是确实可能deliver不到,那message service就收不到websocket server的response;然后就暂时存着好了;他问如果这时候websocket server 1上线了,然后有个用户Bob连上了connection object 1,就deliver错了

我说connection object是跟IP有关的不会错(但是我也不知道connection object具体存的是什么)

总之被问的有点懵
他说让我想更好的从message service找web socket server的方法,我说可以用consistent hashing

总之问题就是:

  1. 怎么处理他说的这种web socket server挂了1M个重连的情况;
  2. 有没有更好的找到相应的websocket server的方法……
  1. 重连需要做 ratelimiting,不让所有的client在同一时间内重连,而是在一段时间里。
  2. 每个 websocket 机器负责某个范围内的用户,可以先根据地域(数据中心)来分,然后 hash(user_id) 决定机器。用户对应的 websocket connection 只需要存在本机上就可以了,不用存数据库给其他 websocket machine 或者 messaging service 去访问。每次发消息的时候,先把消息发送到接收方对应的数据中心,再 hash 找到机器,然后让这台机器找有没有存在的 websocket connection 即可。这样的话,如果宕机,那么内存里的 websocket connection mapping 也就消失了,不会出现 connection 坏了但是记录在存着的情况。
1 个赞

看一下这两个:

面试官完全不懂Networking吧, 怎么可能发到另一个人上面 (无语)。 完全可以有个cache layer 来存socket在哪个 websocket 机器上。 重连需要overwrite之前的value, cache layer 还有TTL。 然后会有jitter 来防止 thunderherd。