远程访问其他服务器的rabbitmq
1.先添加用户并分配角色
rabbitmqctl add_user lisi lisi123 // 设置用户名和密码
rabbitmqctl set_user_tags name administrator
2.用户授权
rabbitmqctl set_permissions -p / lisi ".*" ".*" ".*"
不然会引发异常:pika.exceptions.ProbaleAccessDeniedError
rabbitmq相关命令
rabbitmqctl add_user username password:添加用户 rabbitmqctl delete_user username:删除用户 rabbitmqctl list_users:列出所有用户 rabbitmqctl list_user_permissions username:列出用户权限 rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*":设置用户权限
rabbitmqctl clear_permissions -p vhostpath username:清除用户权限
rabbitmqctl change_password username newpassword:修改密码
rabbitmqctl add_vhost vhostpath:创建虚拟主机
rabbitmqctl delete_vhost vhostpath:删除虚拟主机
rabbitmqctl list_vhosts:列出所有虚拟主机
rabbitmqctl list_permissions -p vhostpath:列出虚拟主机上的所有权限
rabbitmqctl status:节点状态
rabbitmqctl -p vhostpath purge_queue blue:清除队列里的消息
典型应用场景
1.异步处理
场景说明:用户注册后,需要发注册邮件和注册短信,传统的方法有两种 串行和并行
-
串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。这有一个问题是:邮件,短信不是必须的,只是一个通知,这会让客户端等待没有必要等待的东西。
-
并行方式:将注册信息写入数据库后 ,在发送邮件的同时发送短信,以上三个任务完成后,返回给客户端,并行的方式能缩短处理的时间。
-
消息队列:假设三个业务节点分别使用50ms,则串行方式使用150ms,并行使用100ms。虽然并行已经缩短了处理的时间,但是前面说过,邮件和短信对我正常使用网站没有任何影响,客户端不必要等待其发送完成才显示注册成功,应该是写入数据库后就返回。引入消息队列后,把不是必须的业务逻辑异步处理。
由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间 + 写入消息队列的时间(可忽略)。
这里应该使用mq的广播模型,可以被多个消费者订阅,不同消费者实现各自的业务。
2.应用解耦
场景: 双11是购物狂欢节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。
这种做法有个缺点:
当库存系统出现故障时,订单就会失败。订单系统和库存系统高耦合。
引入消息队列:
-
订单系统:用户下单后,订单系统完成持久化处理,再将消息写入消息队列,返回用户下单成功。
-
库存系统:订阅下单的消息,进行库操作,就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
3.流量削峰
场景:秒杀活动,一般会因为瞬间流量过大,导致应用挂掉,为了解决该问题,一般在业务模块前加入消息队列。
作用:
-
1.可以控制秒杀活动人数,超过此一定阈值的订单直接丢弃
-
2.可以缓解短时间的高流量压垮应用(应用能按自己最大处理能力获取订单处理)
过程:
1.用户的请求服务器收到之后,首先写入消息队列,加入消息队列的消息长度超过最大值,则直接抛弃用户请求或者跳转到错误页面。
2.秒杀业务根据消息队列中的请求信息,再做后续逻辑处理