本文以对一个部署在Kubernetes上的微服务应用进行消息演练为例,介绍如何通过场景化演练来发现消息队列中间件的使用问题。

前提条件

  • 您已在机器上安装AHAS探针。具体操作,请参见快速接入ECS
    说明 目前仅支持阿里云ECS环境的自建消息队列。
  • 您已部署了RocketMQ服务端。具体操作,请参见创建资源

背景信息

消息演练提供了一系列自动化功能,包括智能识别消息服务端客户端、自动创建对应演练等。利用消息演练梳理出应用对消息中间件依赖的强弱,检测当消息组件失效的情况下系统是否运行正常。消息演练能够提前发现风险,进而提升应用的高可用能力。关于消息演练的更多信息,请参见什么是消息演练

示例Demo说明

本文示例的应用是一个开源电商Demo,提供了商品选购、购物车、下单等功能。由于应用程序不存在对外部云服务的依赖,并且提供了预构建镜像,所以该应用可以直接部署在任意Kubernetes集群上。Demo应用架构如下图所示。

最佳实践1
该微服务Demo由9个服务构成:
  • nacos-server:注册中心。
  • frontend:前端。
  • recommendationservice:推荐系统,负责对首页的产品列表进行排序。
  • cartservice:购物车。
  • cart-redis:购物车信息储存的数据库。
  • checkoutservice:下单。
  • checkout-mysql:下单信息储存的数据库。
  • productservice:商品。
  • product-mysql:商品数据库。

本文Demo地址:http://47.110.48.250:8080/

步骤一:下载Demo

下载Demo

Demo开源地址:http://github.com/cosmic-jc/alibabacloud-microservice-demo

步骤二:部署Demo

由于是演练消息队列,必须要有消息队列的服务端。微服务示例Demo中已经添加了对应的MQ客户端,并可以在添加购物车的时候自行选择通信方式。

部署应用支持以下两种方案:

  • 使用预编译的镜像部署。
    1. 打开prebuild目录。
    2. 修改frontend.yamlcartservice.yamlrocketmq.namesrv.addr的环境变量,改为您的namesrv地址。
    3. 执行以下命令,将YAML分别部署到您的Kubernetes集群中。
      cd prebuild/
      for i in *.yaml; do kubectl apply -f $i; done
  • 手动编译并部署。
    1. 在根目录运行mvn clean install
    2. 进入每个子模块目录src/{submodule},运行./build.sh,编译并构建镜像文件。
    3. 使用docker push将镜像推送到对应的镜像仓库。
    4. 修改对应的YAML中的镜像地址和对应的namesrv环境变量。
    5. 执行以下命令,部署应用。
      cd prebuild/
      for i in *.yaml; do kubectl apply -f $i; done
说明

由于演练的是消息中间件RocketMQ,会有对应的一些配置参数,例如procuder group、consumer group、topic、tag等。目前在frontend.yamlcartservice.yaml中已注释掉这些配置参数,如需使用,请自行打开并配置。

配置参数说明如下:

  • 默认的producerGroup是PID_CART
  • 默认的consumerGroup是CID_CART
  • 默认的topic是T_CART
  • 默认的tag是cart

步骤三:验证Demo

验证Demo的RocketMQ消息队列功能是否正常。

  1. 登录Demo商城,单击一个商品。
  2. 在商品详情页,选择通信方式为RocketMQ
  3. 单击添加购物车
    系统会跳转到购物车页面,显示刚加入购物车的商品,这说明Demo目前消息队列正常。
    说明 由于是异步消息通知,可能跳转到购物车里没有商品,需要刷新一下页面,即可看到购物车里出现了商品。

步骤四:创建治理方案

创建消息演练,验证消息队列的故障对Demo的影响。

  1. 登录AHAS控制台,然后在页面左上角选择地域
  2. 在控制台左侧导航栏选择故障演练 > 架构高可用,然后在左侧导航栏选择架构高可用 > 消息演练
  3. 消息演练页面,单击创建消息演练
  4. 消息演练页面,选择消息组件,填写相关参数,然后在提示框中单击确认
    • 消息组件:选择消息组件RocketMQ,消息演练目前仅支持RocketMQ。
    • 方案名称:输入方案名称,长度不超过50个字符。
    • 部署环境:选择部署环境ECS,目前仅支持ECS。
  5. 消息演练页面,选择演练方案的各个参数,然后单击下一步
    演练方案.png
    参数 描述
    演练场景 选择需要演练的场景,指用户在使用过程中可能会发生的各种故障场景。
    触发原因 选择需要演练的故障触发原因。演练场景可能是由不同的原因导致的,因此触发原因可以多选,也可删除。
    演练对象 选择演练对象。该页面已罗列了该场景下所有可演练的对象,例如broker场景就会列出所有的broker节点,可多选。
    演练影响预判 说明了可能会出现的演练结果和现象。
  6. 确认您选择的演练场景,然后单击下一步
  7. 单击演练场景操作列的去演练,然后在演练详情页面,单击演练
    演练详情.png
    RocketMQ消息演练开始执行。
    1. 此时再进入Demo商城的商品详情页,选择通信方式为RocketMQ,单击添加购物车,会发现页面没有响应,购物车里无法添加商品,消息演练生效。
    2. 执行kubectl logs frontend-xxxx,查看相关日志,会发现报错信息。日志报错
  8. 演练成功后,在演练详情页面。单击恢复终止。然后在结果反馈对话框,输入结论验证结果
  9. 消息演练页面,单击方案归档,结束1个应用的消息演练治理。
    归档后将无法进行再次分析、验证。未手工归档的方案,系统将在30天内自动归档。

相关操作

您可以根据消息演练结果调整系统架构,设置防护方案,提高系统的高可用性。具体操作,请参见什么是应用防护