这种情况会产生数据库大量IO请求对数据库很不友好
但是使用了消息中间件后 就可以先生成订单 然后商品的详细信息 交由MQ来慢慢的添加到订单信息表中
MQ相当是一个中介 生产方通过MQ与消费者交互并将应用程序解耦
将不需要同步操作的或者是操作时间较长的操作 交由消息队列通知消息接收方进行异步处理 提高了应用程序的响应时间
如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这个时候数据库肯定卡死了。
消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒100个数据, 这样慢慢写入数据库,这样就不会卡死数据库了。
MQ是基于Erlang语言开发的基于底层语言 所有消息的延迟速度能控制住微秒级 单机每秒吞吐量也是万级别的 相对性能较好 并且社区活跃度高
在配置类中开启
publisher-returns: true # 发布方return回调确认开启
靠若类特
publisher-confirm-type: correlated # 开启是否达到交换机的回调(相关联的)
这两个回调 并配置RabbitConfig中ConfirmCallback回调和ReturnCallback
回调
并在发送前 将消息和消息属性 持久化到数据库并给予状态-1后
定时任务 劫取判断ack状态是否发送到交换机如果发送到交换机的话 将数据库中-1的状态改为1 如果没有发送到交换机的话 通过定时任务反复发送每次发送都在数据库中的次数+1如果超过固定次数没有发送成功 则添加该异常数据到数据库并给予状态为4 提供给后期检测
使用简单,功能强大
基于AMQP协议,实现了跨语言 c node.js mq java python
社区活跃度高文档完整
高并发性能好,主要得益于底层基于Erlang语言 C底层语言 性能好java易开发
SpringBoot默认集成RabbitMQ
理解:
生产者发出请求时 通过Connection携带Message到交换机 交换机根据自定义的交换规则 把长链接发来的Message消息去分发或发送给一个或者多个队列并且消费者也通过长链接去实时监听一个QUEUE 一个消费者只能监听一个QUEUE但是一个QUEUE可以被多个消费者同时监听
在使用RabbitMQ时 作为消息发送方希望杜绝出现任何消息丢失的场景 所以MQ为我们提供了两种可靠性投递模式
RabbitMQ的整个投递顺序为
producer ---> rabbitmqbroker ---> exchange ---> queue ---> consumer
RabbitMQ也提供了事务 但是性能较差
使用channel列方法,完成事务控制:
txSelect(),用于将当前channel设置成transaction模式
txCommit(),用于提交事务
txRollback().用于回滚事务
实现“生产者” 产生数据 并发送给一个队列 “消费者”监控这个队列 有信息就消费
生产者 在生产完成信息后需要根据关闭顺序 对连接进行一个顺序断连
消费者 需要实时监控队列 所以不能断连 需要一直开启
考虑到 如果先开启消费者的话 队列中无数据可能会报错 所以在消费者中可以创建一个
在此启动生产者产生信息到队列时 消费者就可以实时接收并消费信息
循环发送10条信息
消费者
因为消费者默认只能启动一次
可以通过设置更改(勾选后可以多次启动 监听同一队列)
实现效果 发送成功后 两个消费者公平分配任务
创建两个队列 并且创建一个交换机 交换机创建后需要绑定 队列
发送的时候只需要发送交换机和badingKey就行了 我这里的key是””
可以创建两个消费者先创建队列 并且绑定交换机 去监听交换机绑定的两个不同的队列
发送成功后效果为
创建不同的线程 和不同的RoutingKey 如图 创建后绑定交换机
消费者消费时 根据RoutingKey和BadingKey判断是否相同 而获取信息并消费
通配符模式认识
Routingkey一般都是有一个或多个单词组成,多个单词之间以”.”分割
例如: item. insert
通配符规则:
#:匹配一个或多个词
*:匹配不多不少恰好1个词
发送时给队列定义KEY值 可以使用通配符表示
消费者 监听队列 给与绑定的带有通配符的key
Topic主题模式可以实现Publish/Subscribe发布与订阅模式和Rout ing路由模式的功能;只是Topic在配置routing key的时候可以使用通配符,显得更加灵活。
首先安装RabbitMQ需要JDK环境,如果虚拟机没有JDK1.8小伙伴们自行去搜一篇教程,很快的,然后我们就进入今天的正题,
因为RabbitMQ是基于Erlang语言编写的这么一个消息中间件,我们需要先安装Erlang
1安装Erlang
1.1安装前线完成条件
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
1.2第二步安装Erlang
yum install -y erlang
1.3我们检查一下是否安装成功
erl 这样就安装完Erlang了
2.安装完Erlang以后我们就可以进行MQ的安装了
2.1和之前一样,我们需要先完成配置的条件,这里我们需要导入一些依赖
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
分别运行这三条语句,如果都没有报错,那救成功了
2.2接下来我们要去下载RabbitMQ的安装包
下载的时候记住选择el7的版本,el7对应centOS7,
因为我这里下载网速会很慢,所有我选择直接在虚拟机里用wget下载,如果虚拟机没有安装wget的小伙伴也要下载wget哦,或者不嫌网速慢的话就直接在官网下载吧
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm
2.3下载完成后我们还需要一些配置
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum -y install epel-release
yum -y install socat
2.4安装我们的MQ包
rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
2.5启用管理平台插件,,可以可视化管理RabbitMQ。
rabbitmq-plugins enable rabbitmq_management
3.最后我们启动MQ来测试一下
3.1启动命令
systemctl start rabbitmq-server
我们查看一下MQ的状态
systemctl status rabbitmq-server
这样RabbitMQ就启动成功了
3.2访问地址http://192.168.128.100:15672
192.168.128.100是你的虚拟机的IP地址,可以用ip addr命令来查看
同时要保证5672和15672端口是打开的,这里可以通过这些命令来查看
#查看防火墙状态
service firewalld status
#关闭防火墙
service firewalld stop
#开启防火墙
service firewalld start
#查看防火墙端口列表
firewalld-cmd --list-all
第一次安装RabbitMQ默认的账号密码都是guest,但是使用guest登录会报错
原因是RabbitMQ3.3以后,guest账号只能在本机登录
我们可以创建一个用户
1.这里创建一个用户名和密码都是admin的用户
rabbitmqctl add_user admin admin
2.设置admin为超级管理员
rabbitmqctl set_user_tags admin administrator
3.授权远程访问
rabbitmqctl set_permissions -p / admin "." "." ".*"
4.重启RabbitMQ
systemctl restart rabbitmq-server
最后我们来登录一下