通信时,遇到如下问题
服务器集群中服务器之间如何通信?
网上看到好多人是通过以下方式去做的:
在做服务器集群时,集群中的服务器需要通信,比如Client1(简称C1)连接到Server1(简称S1),Client2连接到Server2,Client1需要向Client2发消息,S1并不知道C2已连接到S2。
A方案:采用组播(或广播),S1在接收到C1消息后,发送广播包查询C2位于哪个Server上,这时S2向S1回复,S1再将消息发送到S2,S2转发给C2,但是udp是不可靠的,虽然Server都位于同一局域网内,如果消息丢了,那C2就接收不到C1的消息了。
B方案:增加一个路由服务器,所有Server都连接到路由服务器(tcp长连接),S1将消息转发给路由服务器,路由服务器再广播给所有Server,由各个Server自行判断,但这样程序复杂度就上升了,每个Server都会处理本来不属于自己处理的消息,而且路由服务器会成为瓶颈,消息数量大规模增加的话。
这不就是个消息队列嘛,简单的可以用zeromq做,稍微复杂一点可以用rabbitmq/activemq/qpid等等各种成熟方案。
rabbitmq
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传