《[精选]RabbitMQ的实战应用(PPT31页)》由会员分享,可在线阅读,更多相关《[精选]RabbitMQ的实战应用(PPT31页)(32页珍藏版)》请在金锄头文库上搜索。
1、RabbitMQ应用实践,易车二手车 杨伟,目录,Rabbitmq介绍 应用实践 运维实践,第一部分:Rabbitmq介绍,开源AMQP实现,Erlang语言编写,支持多种客户端 分布式、高可用、持久化、可靠、安全 支持多协议:AMQP、STOMP、MQTT、HTTP Rabbitmq主要概念对象:生产者、消费者、交换机、队列 业务解耦:解决多系统、异构系统间的数据交换,解耦生产者和消费者 适用场景:批量数据异步处理、并行任务串行化、高负载任务负载均衡,简要介绍,AMQP工作原理,AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,几个核心概念,颗
2、粒度: Broker:消息队列服务器实体 vhost:虚拟主机,一个broker里可以开设多个vhost Exchange:消息交换机 Queue:消息队列载体 消息流转: Binding:绑定,根据路由规则绑定exchange和queue Routing Key:路由关键字 Connection:连接 channel:消息通道,每个连接可建立多个channel 关联对象 producer:消息生产者 consumer:消息消费者,交换机类型,DirectExchange 完全匹配的路由 TopicExchange 模式匹配路由 FanoutExchange 广播模式 Headersexcha
3、nge 键值对匹配路由,可靠性机制,Message acknowledgment:消息回执 应答机制下:收到回执才删除消息;未收到回执而连接断开,消息会转给其他消费者 应答机制下:忘记回执会导致消息堆积,业务重复处理 采用非应答机制可以提升队列处理效率 Message durability:消息持久化 可以避免绝大部分的消息丢失,如服务重启 采用非持久化机制可以提升队列处理效率 Prefetch count:每次发送给消费者消息数量,默认1,实践采用2,第二部分:部分应用实践,复用connection、复用channel 如果需要可靠业务,需要支持持久化和ack机制 两台虚拟机集群,QPS 5
4、000次/秒 如果希望高吞吐,可以采取非持久化、noack、自动删除机制 两台虚拟机集群测试,QPS 20k次/秒 稳定性保障: 生产者异常保障 消费者异常保障,代码实现需注意细节,生产者面对exchange,消费者面对queue; 一个queue只有一个消费者(可多个副本)进行处理; 命名规划: exchange:ex_bizobj_usecase, 其中:ex为前缀,bizobj为业务对象(如Car、Dealer),usecase为某个业务场景,示例:ex_car_promotion; routekey:对应于event(事件,某个业务动作),如:置顶(settop)、刷新(refresh
5、) queue:为方便使用,建议对应于event(采用exchange + event),如:qu_bizobj_usecase_event,其中:ex为前缀,bizobj为业务对象(如Car、Dealer),usecase为某个业务场景,示例:qu_car_promotion_settop; 串行或并行的业务方案: 并行方案:一个事件发生后,多个消费者相互间没有依赖关系,可由exchange分发消息到多个队列,由各队列的消费者并行进行处理; 串行方案:一个事件发生后,多个消费间有先后依赖关系,可以有先执行的消费者处理事件,处理完成后再次发送消息(此时为另外一个event)到exchange,
6、由后续的队列进行处理。,规划,根据不同的业务颗粒度规划 virtual host规划:按平台或系统规划 Exchange规划:按系统规划 队列规划:按模块规划 MQ消费规划:按模块规划,规划,案例:新车源营销,案例:新车源营销,车源营销 置顶:置顶冻结费用、更新索引曝光判断计费 精准:精准更新索引点击判断计费 刷新:刷新更新索引、计费 发车:发车计费、自动审核更新索引,案例:ELK日志平台,案例:ELK日志平台,案例:通知服务,案例:通知服务,第三部分:部分运维实践,运维实践,安装 配置: 服务器配置 集群配置 高可用集群配置 监控,安装Erlang环境、安装RabbitMQ 启动rabbit
7、mq,并验证启动情况: rabbitmq-server -detached &ps aux |grep rabbitmq 如果启用了防火墙的话,开启相关端口 4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) 15672 (if management plugin is enabled) 启用web界面的监控插件: rabbitmq-plugins enable rabbitmq_management 登录账号密码默认都是 guest 添加用户 rabbitmqctl add
8、_user rabbitmq 123456,安装,两个配置文件: 环境变量的配置文件 rabbitmq-env.conf 设置rabbitmq的数据存储位置 RABBITMQ_MNESIA_BASE=/data/rabbitmq/data 设置rabbitmq的日志存储位置 RABBITMQ_LOG_BASE=/data/rabbitmq/log 配置信息文件 rabbitmq.config 内存阀值,超过时启动GC vm_memory_high_watermark, 0.6 内存阀值,超过阀值时内存数据写到磁盘 vm_memory_high_watermark_paging_ratio, 0
9、.5 脑裂问题的修复方式: ignore, autoheal, pause_minority cluster_partition_handling, autoheal 自动加载broker信息 rabbitmq_management, load_definitions, /etc/rabbitmq/rabbitmq_broker.json,配置:服务配置,日志切分: 编写shell文件:/opt/scripts/rabbitmq_split_log.sh 定时执行 执行 crontab e,加入定时任务,配置:服务配置,修改hostname: 修改 /etc/sysconfig/network
10、 设置.erlang.cookie,基于Erlang的集群来实现 cd /var/lib/rabbitmq/ echo -nPXXXXEWPXODAMMALGXXXX .erlang.cookie 打开端口: 25672,4369 加入集群: sudorabbitmqctljoin_cluster-ramrabbitrabbitmq199 检查集群状态: rabbitmqctl cluster_status 设置镜像队列策略 从集群中分离 在任一节点执行:rabbitmqctl forget_cluster_node rabbitrabbit1 在分离节点执行:rabbitmqctl rese
11、t,配置:集群配置,Rabbitmq集群监控,Rabbitmq集群监控,配置:高可用集群配置,基于Haproxy+keepalived+rabbitmq实现集群,Haproxy配置 Haproxy日志配置 安装rsyslog 添加haproxy的log配置: vim/etc/rsyslog.d/haproxy.conf 编辑/etc/sysconfig/rsyslog 创建日志文件并授权 touch haproxy.log 配置防火墙端口: 9188 用于haproxy的监控界面 5670 用于rabbimq的负载均衡端口 配置haproxy: /etc/haproxy/haproxy.cfg
12、 注意:因为要使用tcp的负载,屏蔽掉与http相关的默认配置 启动haproxy haproxy -f /etc/haproxy/haproxy.cfg 停止haproxy killall haproxy,配置:高可用集群配置,Keepalived配置 VRRP:虚拟路由冗余协议(Virtual Router Redundancy Protocol) 配置文件位置:/etc/keepalived/keepalived.conf 配置keepalived# 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文unicast_src_ip 192.168.200.200unicast_
13、peer 192.168.200.199 启动服务:顺序启动启动haproxy: haproxy -f /etc/haproxy/haproxy.cfg启动keeepalived:先启动master节点,后启动BACKUP节点/etc/init.d/keepalived start 停止keeepalived服务/etc/init.d/keepalived stop 检查keeepalived的运行日志,默认keepalived的日志位于/var/log/messagetail -n100 /var/log/message,配置:高可用集群配置,配置:高可用集群配置,谢谢,演讲完毕,谢谢观看!,