历史
- 最早只能浏览信息的网站是无状态server
- 网站为了跟踪用户加入了cookie, session机制, 这时认为是有状态的server
- 之后流量越来越大, 需要多个server时, 根据hash将某用户请求都分发到某一server里, 此时还是有状态. 但影响server的扩展, 以及重启更新.
- 为了解决3中的问题, 将session存到redis里, 这样server又变成了无状态, 同时还能跟踪用户.
- 到了第4步后Websocket(聊天室\在线游戏)怎么办? tcp连接是ip:port的连接,并且程序依赖ws对象. 所以一个用户的webscoket消息需要总是在一个server(回到3). 但收消息方的ws极可能被建立在另一台server上, 所以需要把消息转发给收消息方的server, 可以每个server里再起一个接口来接收转发的消息, 更好的实现是使用mq!
幂等性
A向B发消息, 可能因为各种原因出现A发了一条, 但给B推两条的情况. 一个永远不可避免的原因是tcp的重发机制. 所以如何尽量避免这种情况? 每个消息带一个唯一id, 在B所在的server记录1分钟内发过消息的id, 如果存在就丢弃消息(也可以用redis, 但感觉server缓存更佳).
分布式websocket实现思路
https://www.cnblogs.com/rolayblog/p/11170954.html