专业的编程技术博客社区

网站首页 > 博客文章 正文

RocketMQ如何突破内网限制,实现内外网互通

baijin 2024-11-18 08:57:18 博客文章 8 ℃ 0 评论

RocketMQ简介

RocketMQ是由阿里巴巴捐赠给Apache的一款分布式、队列模型的开源消息中间件,经历了淘宝双十一的洗礼,实现业务削峰,并支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。

背景介绍

在业务的需要下部署了一套RocketMQ集群环境,随着集团业务的发展,出现某个与MQ集群不在同一内网环境下的服务需要访问MQ集群,这时需要MQ集群可以有内外网互通的能力。开源版本的RocketMQ是不支持内外网同时可以访问的能力的,只能在内网访问与外网访问能力中二选一,但是一些云厂商提供的消息队列RocketMQ版是具有内外网互通的特性的;本文只讨论开源版自建RocketMQ集群的情况下实现内外网互通能力的方案,为有内外网互通业务场景需求的小伙伴提供一些思路。

方案介绍

以下讨论的方案都是基于RocketMQ服务具有内网消息交互能力的情况下讨论实现外网消息交互的能力,基于RocketMQ 4.x.x版本。

方案一 自建代理服务Proxy

代理服务对内网具有RocketMQ原生的生产消费能力, 对外网开放访问能力,代理服务处理消息的中转,通过消息中转实现MQ消息内外网互通的能力;

弊端:

1.代理服务需要通过自研提供消息中转的能力;

2.代理服务会成为瓶颈;

3.代理服务存在单点问题,在外网的生产消费者无法使用到MQ原生的集群能力;

方案二 修改源代码 NameServer同时存储内外网IP

了解RocketMQ中Producer、Consumer、Broker、NameServer这4个角色交互原理的小伙伴都应该知道,Producer或Consumer都是通过NameServer拿到真实的Broker节点的IP,只要修改RocketMQ源码,将Broker的真实内外网IP地址都注册到NameServer中,然后Producer或Consumer根据自身的内外网角色获取对应的内外网IP进行交互即可实现内外网互通;

弊端:

1.需要熟悉RocketMQ原理与源代码,技术门槛较高;

2.修改源码后需要全量测试;

3.RocketMQ升级不好维护;

方案三 修改源代码 代理Producer与Consumer的网络通讯层实现内外网IP转换

通过了解原理与阅读源码,可以看到Producer或Consumer与Broker的网络通讯都在同一个基础包的同一个类中,我们可以对该网络通讯类实现一个代理对象,同时维护一份Broker节点的内外网IP的映射关系,在代理对象中实现网络通讯时的内外网IP转换;

举例说明:

与RocketMQ Broker不在同一个内网环境下的Producer节点,需要与Broker交互,只能通过外网IP连接;但是Producer通过NameServer拿到的是Broker的内网IP,在需要与Broker节点进行网络通讯时,通过代理对象将网络通讯方法上的内网IP参数通过映射关系找到并替换为外网IP,从而实现内外网互通;

弊端:

1.需要维护Broker节点的内外网IP映射关系

总结

从实现的技术难度与时间、人力成本上考虑以及优劣势分析,方案三是目前想到的最优方案。文章RocketMQ如何突破内网限制(实战篇)将分享下从代码层面方案三的具体实现。希望能够给小伙伴能带来帮助,谢谢!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表