- Java游戏服务器架构实战
- 王广帅编著
- 921字
- 2025-03-19 16:19:12
1.3.3 服务消息交互——消息中间件
消息中间件是一类成熟的网络通信组件,它很好地屏蔽了网络的底层通信细节,比如网络连接建立、消息编码解码、消息发布与监听等。它具有高性能、低耦合、发布/订阅、异步性、流量控制、最终一致性等一系列功能,既支持单点部署,又支持集群部署。也有一些RPC,以它为通信基础,实现业务服务之间异步调用,使用起来非常方便。
目前市场上有很多消息中间件产品,比如ActiveMQ、Kafka、RabbitMQ、RocketMQ,它们都能提供消息中间件的基本服务,特别是在分布式服务器架构中,它们扮演着重要的角色。但是在项目中应该使用哪一个呢?可以依据以下几点。
●消息中间件的使用场景。
●能不能满足当前需求,比如性能、稳定性、多客户端支持等。
●在目前系统中,哪个使用起来更加方便。
基于以上原则,本书选择了Kafka,因为目前Spring Cloud Bus可以直接整合Kafka,使用起来更加方便,而且Kafka通信延迟相对比较低,且支持高并发。
内部服务之间,消息中间件就是一个消息中枢,负责所有交互消息的传输。利用消息中间件的低耦合和订阅发布性,一个服务想要给另一个服务发消息,就不需要知道对方的任何信息,不需要和对方建立连接,只需要把消息发布出去,谁对消息有兴趣谁就去订阅,这样大大降低了内部服务之间网络通信的复杂性。
如图1.2所示,网关和业务服务之间的通信就是这种模式。网关接收到客户端的请求之后,只需要根据某些规则,将消息发布出去,负责处理这些消息的服务会主动监听这些消息的发布情况。这样网关和业务服务只需要和消息中间件通信就可以了,而网关与业务服务之间是没有关联的。就算这个时候没有启动业务服务,消息也不会丢失,且被缓存在消息中间件之中。等业务服务启动之后,可以继续处理消息。
利用消息中间件的最终一致性,可以把一些该服务不需要及时处理的消息先发送到消息中间件的消息队列中,保证消息不会丢失,然后由另一个服务再处理这些消息。比如数据库更新的时候会有网络I/O,在等待数据库操作返回的时候,会卡住当前线程,导致当前线程被挂起而不能处理后面的消息。这时就可以把更新数据库操作封装为事件,先异步发送到消息中间件的消息队列中,由另外一个服务不停地从消息队列中取出事件,然后更新数据库。这样就能增加业务消息的吞吐量,提高TPS处理速度,实现数据的异步更新。