将等候通知的消息从 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