基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础组件开发工作。

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。

嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础组件开发工作。

今天主要从三个方面进行分享:

  • 美菜网消息队列的历史
  • 基于 RocketMQ 我们做了那些事情
  • 同城双活的选型和思考

美菜网消息队列的历史

美菜网历史上是多套 MQ 并存,Kafka 用于大数据团队;NSQ 和 RocketMQ 用于线上业务。

多套集群存在的问题:
1、维护和资源成本高昂:Kafka 用 Scala 语言, NSQ 用 GO 语言, RocketMQ 用 Java 语言,维护成本较高,每套 MQ 不论消息量多少,至少部署一套,资源成本较高。
2、易用性较差:三套 MQ 基本上都是开箱直接使用,二次开发比较少,业务接入不方便,使用混乱。消费者接入时,需要知道 topic 在那套集群上,使用哪种客户端接入。
3、可靠性:比较了一下 RocketMQ 和 NSQ 内置的复制机制。NSQ 多通道之间是复制的,但是其本身是单副本的,存在消息丢失的风险。

统一集群的选型比较:
1、功能性,核心的功能每个 MQ 都有,考虑更多的是附加功能,比如延迟消息、顺序消息、事务消息,还有就是消息的回溯、基于 key 的检索。
2、可靠性, RocketMQ 就像前面几位老师说的,有多种刷盘和同步机制,可以结合自己的需求灵活配置,美菜网用了 2 年多时间,表现一直比较稳定。
3、技术栈的匹配,公司是以 java 语言为主,php 为辅。
4、社区完备性来说, RocketMQ 社区是比较活跃的,而且支持也是比较到位。
可以通过微信、钉钉、邮件,还有像今天这样的线下沙龙,这也是我们考虑的一个非常重要的点。

统一集群的迁移方案:
1、协议的兼容, RocketMQ TCP 协议,对 java 原生支持,仅需依赖一个 jar 就可以进行使用了, NSQ 使 http 协议。
2、业务的无感,迁移过程中,解耦生产者和消费者迁移,实现平滑的迁移。
3、消息不丢失,迁移过程中消息必然是不能丢失消息的,很容易理解。我们来看下图,这个是我们当时迁移时的解决方案。

lALPDgQ9rAp16CfNAhTNBQA_1280_532_png_620x10000q90g

左边是 Producer ,业务通过 Http 连接 NSQ ,对于生产者,实现一个 http 网关,来接收业务生产消息转发到 RocketMQ 。对于消费者,实现一个 transfer 的工具,将消息透传到 NSQ ,这样对消费端是无感的,生产端完成迁移了,消费者可以逐步的往 RocketMQ 上迁移了,所以整个迁移过程还是比较顺利的。

基于RocketMQ我们做了那些事情

诉求:
1、多语言支持,前面已经提到了美菜网的技术栈以 Java 语言为主,还有 php , go , python 语言等。
2、易用性,业务接入快捷,方便。
3、稳定性,保证整个平台的稳定可靠。

多语言的支持:

lALPDgQ9rAp16CnNAknNBQA_1280_585_png_620x10000q90g

生产处理器,提供 HTTP 协议消息生产支持;消费处理器,消费端的网关,不断从 RocketMQ 拉取消息,通过 http 发送到消费端client;流量调度器,根据 topic 的 SLA 做路由、流量调度。

易用性:
主要是从业务使用角度,降低业务的接入成本,提高业务接入的效率。
1、自定义 SDK ,同时定义了一个 spring 标签库,使用起来简单。
2、加入了一些 trace ,指标采集功能,对消息积压和失败的报警。
3、消息轨迹,消息从生产到 broker ,再到消费有一个完整的可以追踪的功能,这样出现了问题就可以很容易的排查,防止出现生产者说发了消息,消费者说没有收到消息的相互扯皮的问题。
4、失败消息补发, RocketMQ 是有失败重试机制的,失败消息会进行 16 的失败重试,最终到死信队列中,不再投递。可能业务系统出现了故障,经过较长一段时间的解决,解决之后希望消息可以重新发送。

lALPDgQ9rAp16DDNAmfNBQA_1280_615_png_620x10000q90g
lALPDgQ9rAp16DbNAlTNBQA_1280_596_png_620x10000q90g

稳定性:
1、集群隔离,我们会按照 SLA 隔离出业务集群、日志集群、计算集群。业务集群采用的主从同步,同步落盘,计算集群采用主从异步,异步落盘,日志集群就是单主结构

lALPDgQ9rAp16DrNAovNBL8_1215_651_png_620x10000q90g

2、完善故障预案
节点故障,快速下线,一键扩容。

主节点挂掉,从节点提升为主节点,主节点改为只读。

3、完善监控报警机制
生产延迟**, TPS , TP99 多维度指标数据
**

lALPDgQ9rAp16DvNAlbNBQA_1280_598_png_620x10000q90g

同城双活的选型和思考

背景:
1、保证数据可靠性,如果所有数据都在一个机房,一旦这个机房出了问题,数据有丢失的风险。
2、机房的扩容,单机房毕竟容量有限,多个机房可以分担流量。

方案选型:
1、同城冷备,备用一套服务存在但不对外提供服务,当另一套服务有问题时进行切换,但是真的出了问题,我们是否敢切流量呢?
2、同城双活,平时就是双机房对外提供服务,出问题的时候切掉故障机房,真正实现容灾的目的。

几点诉求:
1、机房就近,生产者在a机房,生产后的数据也在 a 机房的 broker ;消费者在b机房,消费的消息也来自 b 机房 broker 。
2、应用平滑迁移,支持按 topic ,应用逐步迁移。
3、故障的快速切换。

几个关键点:

lALPDgQ9rAp16D3NAkfNBQA_1280_583_png_620x10000q90g

就近识别算法:
1、 IP 段的方式,不同的 IP 段表示不同的机房,该方案对公司网络要求较高,公司网络调整,也需要修改修改算法,升级客户端。
2、协议层增加机房标识,在生产和消费的 client 通信的时候都添加上所在机房标识,改动成本较高。
3、 broker 名字增加机房标识,客户端 clientID 增加机房标识,该方案改动成本较低,对 MQ 核心功能无入侵。

数据复制:
实现主-从-从结构,基于 slave 异步复制,减轻 master 节点的压力。

故障预案:
机房或链路出现问题时。需要关闭一层机房的写权限。
机房接入层故障,无影响。

我们接下来要做的事情

1、大规模集群化的运维。目前的情况下,当大规模集群需要运维的时候是很棘手的,如果实现真正的无人值守的就会好很多。
2、按 SLA 进行自动 topic 路由调整。目前这个需要我们和业务方去提前沟通确认好,人工来调整,未来期望可以自动调整。

本文作者:李样兵, 2012 年研究生毕业, 2016 年加入美菜,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础组件开发工作。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
9天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
4天前
|
监控 Java 测试技术
现代化软件开发中的微服务架构设计与实践
随着软件开发的发展,传统的单体应用架构已经无法满足现代化应用的需求。微服务架构作为一种新的设计理念,为软件开发提供了更灵活、可扩展的解决方案。本文将介绍微服务架构的设计原则、实践方法以及相关技术工具,并结合实例展示其在现代化软件开发中的应用。
|
4天前
|
消息中间件 监控 JavaScript
Node.js中的微服务架构:构建与实践
【4月更文挑战第30天】本文探讨了在Node.js中构建微服务的实践,包括定义服务边界、选择框架(如Express、Koa或NestJS)、设计RESTful API、实现服务间通信(HTTP、gRPC、消息队列)、错误处理、服务发现与负载均衡,以及监控和日志记录。微服务架构能提升应用的可伸缩性、灵活性和可维护性。
|
4天前
|
消息中间件 测试技术 API
构建高效微服务架构:从理论到实践
【4月更文挑战第30天】 随着现代软件开发的演进,微服务架构成为了企业追求敏捷、可扩展和容错性的关键解决方案。本文将深入探讨构建高效微服务架构的核心原则和策略,并通过一个实际案例来展示如何将这些理论应用于生产环境。我们将重点讨论服务的划分、通信机制、数据一致性以及持续集成与部署的实践,旨在为开发者提供一个清晰、可行的技术蓝图,以支持快速迭代和系统的稳健运行。
|
4天前
|
运维 监控 负载均衡
探索微服务架构下的服务网格(Service Mesh)实践之路
【4月更文挑战第30天】 在现代云计算的大背景下,微服务架构以其灵活性和可扩展性成为众多企业转型的首选。然而,随着服务的激增和网络交互的复杂化,传统的服务通信模式已无法满足需求,服务网格(Service Mesh)应运而生。本文通过分析服务网格的核心组件、运作机制以及在企业中的实际应用案例,探讨了服务网格在微服务架构中的关键作用及其带来的变革,同时提出了实施过程中面临的挑战和解决策略。
|
4天前
|
Kubernetes 监控 Cloud Native
构建未来:云原生架构的演进与实践
【4月更文挑战第30天】 随着数字化转型的不断深入,企业对IT基础设施的要求日益提高。云原生技术以其独特的弹性、可扩展性和敏捷性成为推动现代应用开发的关键动力。本文将探讨云原生架构的核心组件、实施策略以及面临的挑战,旨在为读者提供一个关于如何有效构建和部署云原生应用的全面视角。
|
5天前
|
Cloud Native Devops 持续交付
构建未来应用:云原生架构在现代企业中的实践与挑战
【4月更文挑战第29天】 随着数字化转型的加速,企业正迅速转向云计算以支撑其业务敏捷性和创新。云原生技术,作为推动这一转型的关键因素,正在重新定义软件开发和运维模式。本文将深入探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps文化,并分析这些技术如何帮助企业实现弹性、可扩展和高效的应用部署。同时,我们将讨论在采纳云原生实践中所面临的挑战,包括安全性、治理和人才缺口等问题。
|
5天前
|
运维 Cloud Native Devops
构建未来应用:云原生架构的演进与实践
【4月更文挑战第29天】在数字化转型的浪潮中,企业亟需灵活、高效的技术支撑来应对市场的快速变化。云原生架构以其独特的设计理念和技术栈,成为推动这一变革的关键力量。本文深入探讨了云原生的核心概念、关键技术和实施策略,旨在为企业提供一个清晰的云原生转型蓝图,助力其构建更加动态、可扩展的应用系统。
|
5天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
5天前
|
Kubernetes Cloud Native 持续交付
构建未来:云原生架构在现代企业中的应用与实践
【4月更文挑战第29天】 随着数字化转型的浪潮席卷各行各业,企业对于信息技术基础设施的要求日益提高。传统的IT架构已难以满足快速迭代、灵活扩展和持续创新的需求。本文聚焦于云原生架构,一种为云计算环境量身打造的设计理念和技术集合,旨在帮助企业构建更加灵活、可靠和高效的系统。通过对云原生核心组件的解析、实施策略的探讨以及成功案例的分析,我们揭示了云原生架构如何助力企业在竞争激烈的市场中保持领先地位。

相关产品

  • 云消息队列 MQ