webSocket中并发的策略

本文探讨了WebSocket在并发场景下如何处理连接和消息,重点在于选用合适的数据结构来存储Session和消息。作者提出使用HashMap<Session, Message>并结合ConcurrentHashMap解决并发问题,同时讨论了业务扩展性和高并发时的消息队列解决方案,以保证服务的可扩展性和消息的有序、不丢失。此外,还提及了倒排索引的概念,以优化大量通道的处理效率。" 78418649,6577302,C++实现文件压缩与Huffman树,"['压缩算法', 'C++编程', '数据处理', '文件系统']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:当客户端发送请求建立连接以后,服务器会采用一种数据结构来维护这个连接,具体体现就是每次连接,服务器就会产生一个Session,这个Session可以唯一标识这个通道,发数据的时候会把指定的数据放到特定的通道里面去。那么并发情况下,如何实现呢?

从开始一个最简单的webSocket实例跑通了以后就慢慢考虑并发的问题,策略换了好几种,不过都是大家讨论后的结果,由于水平有限不一定是最优的方案。

服务器端通过继承父类的handleTextMessage方法来处理产生的session和从客户端传过来的参数。关于采用什么样的数据结构来存储session和message讨论出来了很多方案。

    protected void handleTextMessage(WebSocketSession session,
                                     TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
    }
发送消息的时候需要把参数转化成TextMessage类型,然后调用通道的sendMessage方法,如下:

    public void sendMessage(String  request) throws IOException {
        TextMessage returnMessage = new TextMessage(request);
        session.sendMessage(returnMessage);
      }
    }
那么并发情况下,由于是多个客户端连接,需要建立多个通道,通道可以在handleTextMessage的方法里面采用一种数据结构收集起来,然后在sendMessage方法中指定通道然后发送对应的消息。在前一篇文章中提到我们项目中已经做好了一套通信机制:终端发过来的数据通过NIOServer转发到activeMQ中,也就是说所有的消息可以通过activeMQ的出口得到,那么这里就是一种观察者模式的使用了,也就是多个webSocket通道就是多个观察者,而这个监听的出口就是被观察者,当消息队列出口出来一条消息的时候,就类似于被观察者的发生变化了然后通知多个webSocket通道,webSocket通道知道出来消息了马上就检查这条消息是不是自己要的,如果是的话就发送到当前通道中。在handleTextMessage方法中,会从客户端传回来一个参数message,这个message就是表示通道订阅的消息,也就是每次从队列里面出来一条消息,我就检查这条消息是否是我订阅的,即将消息解析后然后和message参数比对。不知道我有没有说清楚,应该是不难理解的。

</

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值