常规订单系统
使用消息中间件的订单系统
常规秒杀系统设计
消息中间件典型场景
1.异步处理
2.应用解耦
3.流量削锋
4.消息通讯
RabbitMQ消息中间件介绍
Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。
RabbitMQ重点特性
1.灵活的路由(Flexible Routing)
在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
2.多语言客户端(Many Clients)
RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
3.管理界面(Management UI)
RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
4.插件机制(Plugin System) RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
RabbitMQ安装
安装docker(略)
拉取RabbitMQ镜像 :docker pull rabbitmq
启动RabbitMQ容器: docker run -i -t -d -p 5672:5672 -p 15672:15672 rabbitmq
启动RabbitMQ的web端插件 :docker exec -i -t 55 /bin/bash rabbitmq-plugins enable rabbitmq_management
RabbitMQ名词解释
1.Server(broker): 服务器,接受客户端连接,实现AMQP消息队列和路由功能的进程。
2.Virtual Host:虚拟主机, 类似于权限控制组。
3.Connection:物理连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。
4.Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。
5.Exchange:路由,接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。
6.Message Queue:消息队列,用于存储还未被消费者消费的消息。
7.Binding:绑定关系,Binding联系了Exchange与Message Queue。
8.Message: 消息体,由Header和Body组成,Header是由生产者添加的各种属性的集合。而Body是真正需要传输的APP数据。
RabbitMQ消息队列模式之简单模式:一个生产者P发送消息到队列Q,一个消费者C接收
RabbitMQ消息队列模式之工作模式:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列
RabbitMQ消息队列模式之发布/订阅模式
一个生产者发送的消息会被多个消费者获取。一个生产者、一个交换机、多个队列、多个消费者 生产者:可以将消息发送到队列或者是交换机。 消费者:只能从队列中获取消息。 如果消息发送到没有队列绑定的交换机上,那么消息将丢失。 交换机不能存储消息,消息存储在队列中
RabbitMQ消息队列模式之通配符模式
上面的路由模式是根据路由key进行完整的匹配(完全相等才发送消息),这里的通配符模式通俗的来讲就是模糊匹配。 符号“#”表示匹配一个或多个词,符号“*”表示匹配一个词。
RabbitMQ例子-pom文件
RabbitMQ例子-连接工厂
RabbitMQ例子-简单模式-生产者
RabbitMQ例子-简单模式-消费者
RabbitMQ例子-工作模式-生产者
RabbitMQ例子-工作模式-消费者
RabbitMQ例子-消息签收:
为了确保消息不会丢失,RabbitMQ支持消息签收。消费者发送一个消息签收,告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ就可以删除它了。
如果一个消费者挂掉却没有发送签收,RabbitMQ会理解为这个消息没有处理完全,然后交给另一个消费者去重新处理。这样,你就可以确认即使消费者偶尔挂掉也不会丢失任何消息了。
自动签收: 不在乎消费者对消息处理是否成功,都会告诉队列删除消息。
手动签收: 消费者处理完业务逻辑,手动返回ack(通知)告诉队列处理完了,队列进而删除。
RabbitMQ流量销峰思路一 设置队列消息长度:
RabbitMQ有两种对队列长度的限制方式: 对队列中消息的条数进行限制 x-max-length 对队列中消息的总量进行限制 x-max-length-bytes 对消息总条数进行限制(总条数包括未被消费的消息+被消费但未被确认的消息):
RabbitMQ流量销峰思路二 扫描消息队列长度
RabbitMQ给我们提供了获取指定消息队列中剩余消息数的方法,我们可以通该方法对消息队列进行监控; channel.messageCount("tx_queue");
根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加群654631948领取下学习资料,面试题,开发工具等,群里有资深java老师做答疑,每天也会有基础部分及架构的直播课,也可以加我的微信renlliang2013做深入沟通,只要是真心想学习Java的人都欢迎。
java基础教程:https://ke.qq.com/course/149432?tuin=57912c43
Java分布式互联网架构/微服务/高性能/springboot/springcloud:
https://ke.qq.com/course/179440?tuin=57912c43