当前位置: 代码迷 >> 综合 >> 操作RabbitMQ完成消息通知,NIO、IO、netty基本分析
  详细解决方案

操作RabbitMQ完成消息通知,NIO、IO、netty基本分析

热度:5   发布时间:2024-02-05 12:21:43.0

将等候通知的消息从 tb_notice_fresh 转移到RabbitMQ中
//subscribe订阅通知
//1 创建Rabbit管理器
RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate.getConnectionFactory());

        //2 声明Direct类型交换机,处理新增文章消息
DirectExchange exchange = new DirectExchange("article_subscribe");
rabbitAdmin.declareExchange(exchange);

        //3 创建队列,每个用户都有自己的队列,通过用户id进行区分
Queue queue = new Queue("article_subscribe_" + userId, true);

        //4 声明交换机和队列的绑定关系,需要确保队列只收到对应作者的新增文章消息
// 通过路由键进行绑定作者,队列只收到绑定作者的文章消息。
//第一个是队列,第二个是交换机,第三个是路由键作者id
Binding binding = BindingBuilder.bind(queue).to(exchange).with(authorId);


//1. 如果订阅,声明要绑定的队列
rabbitAdmin.declareQueue(queue);
// 添加绑定关系
rabbitAdmin.declareBinding(binding);

     //2. 如果取消订阅,删除队列绑定关系
rabbitAdmin.removeBinding(binding);

//save添加文章群发通知

    /发消息给RabbitMQ,就是新消息的通知
//第一个参数是交换机名,使用之前完成的订阅功能的交换机
//第二个参数是路由键,使用时文章作者的id作为路由键  --  作者id = userId, 
//第三个参数是消息内容,这里只完成新消息提醒,内容是文章id
rabbitTemplate.convertAndSend("article_subscribe", userId, id);

一、IO编程  : 数据读写以字节流为单位,效率不高 - byte
传统IO模型中,每个连接创建成功之后都需要一个线程来维护,每个线程包含一个while死循环。 若用户数量较多,服务端可能需要支撑成千上万的连接,IO模型可能就不太适合了

二:NIO  new-IO或non-blocking-IO,非阻塞IO
新来的连接不再创建一个新的线程,而是可以把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由这个线程来负责

    通道(channel):双向(Stream单向,读写分离)
缓冲(buffer):理解成一块内存区域,可以写入数据,并在之后读取它
选择器(selector):多个连接注册到一个选择器处理,一个线程监测多个注册在它上面的信道,通过一定的选择机制,实现多路复用的效果

引入了IO多路复用器selector,selector是一个提供channel注册服务的线程,可以同时对接多个channnl,并在线程池中为channel适配、选择合适的线程来处理channel。由于NIO模型中线程数量大大降低,线程切换效率因此也大幅度提高

三、netty - 推荐
已经由NIO能够提高程序效率了,为什么还要使用netty? 简单说法:netty封装了JDK的NIO,让你用的更爽,你不用再写一大堆复杂的代码了;官方说法:netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端

serverBootstarp :服务端
Bootstarp :客户端
channel
EventLoop
EventLoopGroup :(理解成  组、java中的线程池)
ChannelHandler和ChannelPipeline
ChannelInitializer
ChannelFuture

四、websockek
Socket