(1)分布式、微服务等项目,需要对服务进行解耦的项目。

(2)邮件服务等无需立刻执行的服务,根据服务能力进行消费,避免高并发压垮服务器,进行流量的削峰填谷。

技术方案概要介绍

随着项目运营,越来越多的用户访问、高并发请求,部分高耗时接口(报告生成、发送邮件)已经开始影响服务的稳定性和可用性,服务解耦、削峰填谷已成为必须。

 

方案解决的问题

(1)高并发带来的服务延迟、消费不及时,最终导致业务服务之间的通信异常问题

(2)解决多节点部署RabbitMQ时负载不均衡的问题

 

3、成效说明

(1)业务服务器在高并发时,极大减少高耗时接口的服务延迟感,提升了用户体验。

(2)集群部署RabbitMQ时,负载均衡策略生效,避免了流量集中访问单节点的问题。

 

技术方案的详细说明


1、技术说明

使用docker进行HAProxy和RabbitMQ集群服务的部署。

集群架构图:

 

 

 

 

难点

集群部署时,多个RabbitMQ节点的互联配置容易出现错误,如Erlang Cookie值必须相同,因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。

 

下面是集群部署的示例:

启动三台RabbitMq

docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

 

设置节点1

docker exec -it myrabbit1 bash

rabbitmqctl

stop_app

rabbitmqctl reset

rabbitmqctl start_app

exit

 

 

设置节点2

docker exec -it myrabbit2 bash

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbit1

rabbitmqctl start_app

exit

 

 

设置节点3

docker exec -it myrabbit3 bash

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbit1

rabbitmqctl start_app

exit

 

 

 

注意点

(1)多个容器之间使用“--link”连接,此属性不能少;

(2)Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同;

(3)参数“--ram”表示设置为内存节点,忽略次参数默认为磁盘节点。

 

说明

(1)通过RabbitMQ消息队列中间件,将项目的分布式服务由原本高耦合的RPC调用方式调整为队列消费模式,解耦了服务与服务之间的联系。

(2)将项目中的邮件服务、报告服务等不需要及时处理且高耗时的请求,调整到队列中,由对应的服务按需进行消费,避免过长的程序耗时影响用户体验。

(2)将Haproxy作为队列集群的网关,进行负载均衡,避免单节点性能消耗过高而影响服务稳定。

 


创新收益

(1)提高玩家体验游戏的流畅感

(2)节日活动等大流量时间段,通过水平拓展节点来灵活提高服务器性能,保证玩家氪金体验。

(3)提高了服务器的可用性,减小公司因为服务故障造成的损失。

 

 

posted on 2021-09-23 11:19  Boom__Clap  阅读(465)  评论(0编辑  收藏  举报