团队中前些天遇到这样一个问题,比较有意思也比较典型,我给出方案后团队成员实施出来,最终问题得以解决。 > 一个智能终端连接到Netty服务保持会话,在异步完成某项操作后回调回来需要通过会话通知终端,终端再根据通知做相应业务处理, > 在部署单节点的情况下是OK的,但是系统整体由于要做HA,部署多节点后就会出现问题: 并不能保证该回调请求一定负载到终端保持会话的节点。
如何解决这个问题?这里跟大家分享一种类似场景的通用解决方案,以下是流程图:
< Async Callback Model in Cluster Architecture >
(D) Broadcast to all nodes
+-----------------------------------------------------------------------+
v |
+ - - - - - - - - - +
' Cluster: '
' '
+--------+ (A) Connect ' +---------------+ ' (B) Async call +---------------+ (C) Callback +----+
| | -------------> ' | Server Node A | ' ----------------> | | --------------> | |
| | ' +---------------+ ' | | | |
| | ' ' | | | |
| | + - - - - - - - - - + | | | |
| | (E) Notify : | | | |
| | <................... | | | |
| | | | | |
| Client | + - - - - - - - - - + | Remote Server | | MQ |
| | ' ' | | | |
| | ' +---------------+ ' | | | |
| | ' | Server Node B | ' | | | |
| | ' +---------------+ ' | | | |
| | ' +---------------+ ' | | | |
| | ' | Server Node C | ' | | | |
| | ' +---------------+ ' | | | |
| | ' ' | | | |
+--------+ + - - - - - - - - - + +---------------+ +----+