本文已参与「新人创作礼」活动,一起开启掘金创作之路。
消息中间件主要解决的问题是:
同步变异步 流量销锋 系统解耦 例如: 用户--->订单服务 会调用短信服务、邮件服务等、、、是同步区调用这些系统耦合度比较高。
mq可以解决。
1、创建一个队列(在项目启动时就创建)bean 2、创建一个生产者 3、创建一个消费者(消费者采用监听生产者)
交换器: 通过路由键分发不同的消息队列 再通过信道来传递给消费者
【发布与订阅、广播、主题】
direct(发布订阅)一个路由键对应一个消息队列进行匹配。 步骤: 生产者配置配置文件 交换器、路由键 消费者配置文件 交换器、路由键、队列名称
根据交换器指定对应的路由键找到对应的队列
- topic(主题)交换器去模糊匹配路由键对应的消息队列。 所有服务的日志都进交换器,然后交换器去模糊匹配路由键对应的消息队列。 步骤: 创建服务生产者 配置文件给一个交换器名称即可 创建服务消费者
配置文件:交换器名称、消息队列名称
- fanout(广播) 将消息放到fanout(广播)的交换器,发送到每一个消息队列。然后由消费者直接订阅消息队列。(没有路由键)
- 广播模式不指定路由键,消息消费者直接全部订阅消费。(就是都可以所有服务只要配置指定交换器都可接收到消息)
实现松耦合设计
在消费者中添加一个服务即可。配置相同。
消息持久化
解决丢失消息: 消费者服务中把autoDelete =改 "false",表示在消费者宕机时依然往mq里发送消息,没有消费的消息都会被mq暂存起来。等待消费者服务启动后,立即消费.
解决ACK的内存泄露问题 1、在消费者端接收消息代码,用thy{}catch{}进行异常捕捉 2、在配置文件中添加重试次数
项目参考图:
代码地址:
github.com/SongXianYan… 编写确实不易