项目经验(WebSocket、RabbitMQ、Kafka)

1. 项目技术的变更(RabbitMQ—>Kafka)

以前我们公司用到的MQ是RabbitMQ,后来随着项目的功能需求,我们替换成Kafka会更加的适合;
项目的功能:每辆车每5s中发送GPS数据到服务器,当车辆数够多的时候,RabbitMQ已经明显不如Kafka;所以我们MQ改用Kafka;

2. RabbitM与Kafka的区别(区别一)

Kafka的体量比RabbitMQ的体量更大
什么意思呢?
打个比方:比如我们高速路口有n个收费口A、B、C…(收费口=队列,车辆=消息)
如果是RabbitMQ那么车辆是先从A收费口进去,其他收费口空闲状态,如果这个时候A收费口挂了,这个时候车辆才会去B收费口,同时A收费口的车辆合并到B收费口…

如果换成Kafka那么车辆是从各个收费口进去,如果这个时候A收费口挂了,那么这时候会有A的 镜像 顶替上来,同时A的车辆合并到镜像…

这也是Kafka吞吐量大的原因…
在这里插入图片描述

3. JS的setInterval结合HTTP和WebSocket

需求:前端浏览器需要从后台获取数据,但是后台不一定有数据(此数据从终端使用Kafka异步发送过来),所以我们要定时从后台获取数据。

解决方法一:JS的setInterval结合HTTP
之前我们是使用JS的定时器:setInterval定时发送HTTP请求从后台获取数据的,但是这种方法low,太low…

后来我们想到了另一个解决方法:使用WebSocket

解决方法二:WebSocket

WebSocket:WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

听起来似乎问题已经完美的解决了,不!!!这样会有一个问题,结合实际环境,我们并不知道后台有多少台服务器,如果我们使用了集群,每个服务有多台服务器,假设有A、B两台,那么这个时候前端浏览器只和A建立了连接,那如果你的请求到了B服务器怎么办?那浏览器就获取不到数据了,如果后台要做数据同步的话太麻烦,low…
在这里插入图片描述

解决方法三:RabbitMQ
后台接收(消费)到终端的数据,这个时候将数据发送的RabbitMQ队列中,然后前端消费消息,这也是我们要说的RabbitMQ与Kafka的第二的区别:RabbitMQ封装了WebSocket,我们在前端可以写js代码消费RabbitMQ的消息,这样就完美达到了我们的目的。

PS:RabbitMQ不仅提供了JS的连接,还提供了Android的连接。
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式 Websocket 是指在集群环境下,实现多台机器之间共享 Websocket 连接和消息推送的方案。在单机情况下,由于用户已经与 Websocket 服务建立连接,消息推送是可以成功的。但在集群环境下,用户与 Websocket 服务建立连接的服务可能与需要给用户推送消息的服务不一致,这就需要解决分布式环境下的 Websocket 连接共享问题。 针对分布式 Websocket 的解决方案,可以考虑以下几种思路: 1. 将 Websocket Session 序列化并存储到 Redis,实现数据共享。在 Spring 集成的 Websocket 中,每个 WS 连接都有一个对应的 Session,称为 WebSocketSession。但是,由于 WS Session 无法直接序列化到 Redis,无法将所有 WebSocketSession 缓存到 Redis 进行 Session 共享。 2. 使用中间件或消息队列来实现分布式消息推送。可以使用诸如 RabbitMQKafka 等消息队列服务,将需要推送的消息发送到消息队列,然后由各个 Websocket 服务订阅相应的消息队列,实现消息的分发和推送。 3. 使用负载均衡器和会话粘性(session affinity)来保证用户的 Websocket 连接始终与同一台服务器保持连接。负载均衡器负责将用户的请求分发到不同的服务器上,而会话粘性则会保证用户的后续请求都会路由到与其最初连接的服务器上,从而保持连接的连贯性。 在实现分布式 Websocket 的过程中,需要根据具体的应用场景和需求选择适合的方案,并结合实际情况进行实现和调优。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值