Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >京东到家开放平台消息系统-进阶之路

京东到家开放平台消息系统-进阶之路

作者头像
架构之家
发布于 2022-07-12 05:18:45
发布于 2022-07-12 05:18:45
85400
代码可运行
举报
文章被收录于专栏:架构之家架构之家
运行总次数:0
代码可运行

京东到家开放平台,是一个面向商家以及第三方开发者-开放服务、持续赋能O2O业务的到家服务集成平台。是商家数据与到家数据打通的桥梁,开放平台、商家、到家三者之间的关系如图所示。

既然是数据通讯的桥梁,必然涉及到双向通信,开放平台提供大量的可调用的API接口,同时要求商家提供必要的接口供到家调用,比如新订单的产生,订单状态变更,新增门店信息,促销信息审核等等。

其中API接口由于是到家提供,相对来讲比较稳定,而通知接口是商家提供,大量不确定因素都需要考虑,比如接口挂掉了,服务器宕机,网络中断等等,出了问题后还面临如何快速发现,重新推送,推送频次,重试时长,消息间会不会相互影响等问题。这些在消息系统设计之初都应该考虑到。

消息系统核心机制的设计

开放平台的消息系统(Business Message Queue,简称BMQ)是基于内部系统的MQ,这些MQ被内部各业务系统订阅的同时,也被开放平台订阅,平台进行格式转化(标准消息或非标准消息)后,发送给商家,基本概念如图所示。

MQ系统是京东自主研发的一款消息中间件系统,具有高可用、数据高可靠等特性。所以可以直接使用MQ来保证平台自动重新推送消息,推送频次,重试时长,以及消息的不丢失。那直接利用有什么弊端呢?

以新订单消息为例,当一个商家的接口挂了,就会不断重试,甚至积压,一旦积压就会影响到没有问题的商家。那怎么解决这个问题?能不能针对商家维度进行消息推送?

开放平台的做法是,将重点ka与普通商家分离,所有ka商家独立通道,ka商家是可扩展的,当有必要时可以从非ka商家中提取单独通道进行处理,这样就将业务维度转换成了商家维度,具体做法如图所示。

这样简单做可以了吗?其实大家会发现一个问题,虽然ka商家间的影响小了,但是非ka商家仍然存在相互影响的问题,随着业务增长,非ka商家间相互影响会越来越大,ka商家通道的不同业务之间也会互相影响吗?

以沃尔玛为例,一个新订单消息接口挂了,会不会影响售后消息呢?这是非常有可能的,同时也有一个非常简单的做法就是按业务再次分离,因为消息的种类非常多,每个商家的每个消息都单独开辟消息通道,显然要申请大量的topic,不太利于维护和管理。

开放平台的做法是,每个通道增加专门的重试通道,一旦消息有问题,直接丢到重试通道即可,这样就不影响正常的业务了,具体做法如图所示。

这样就解决了大部分问题,在实际的运行过程中也发现是可行的。以为可以高枕无忧了吗?直到一次出现了常规通道中大量积压,可是重试通道却没有数据,原来,我们httpclient允许的超时时间是3秒,超过3秒被认为是失败的,会丢到重试通道中,但实际上商家出现了大量慢响应,可能都在2秒多才返回,这样引发不了发送失败的条件,造成常规通道中的积压。

开放平台针对这种情况的做法是,每个通道增加专门的降级通道,我们实时监控统计(kafka+flink)单商家单消息响应时间超过阈值的次数,对于规定时间内单商家单消息统计次数超过阈值的打上降级标。开放平台在消费到家内部业务MQ时,有降级标的商家消息会直接进入对应的降级通道,不会进入常规通道。实时监控统计也会对恢复正常的单商家单消息清除降级标记,降级通道中执行失败的消息处理方式同常规通道一样,都会进入重试通道。具体策略如图所示。

以上基本上解决了大部分实际的场景,并且还具有可扩展空间,比如发现非ka的量较大时,可以将消息较多的商家提出单独通道即可,总结就是采用三种通道结合具体策略达到了应对实际情况的方案,归纳如图所示。

到家开放平台是如何保证消息顺序问题?因为平台具备自动重试能力,所以没有严格确保消息顺序,只是使用了MQ自身保证的顺序,平台对调用商家接口定义为仅消息通知,需要商家接到消息通知后反查到家接口,要求商家提供的消息接口具备排重能力。

消息系统的预警机制

核心的设计虽然解决了实际环境中的各种问题,但这主要解决了平台的风险,仍然面临的问题有:

1、接口出现了问题怎们能第一时间通知给商家,毕竟要求所有商家建立及时有效的报警也不太现实。

2、非ka商家共用通道还是有一些相互影响的风险。

3、知道了这些风险后,需要哪些工具来定位和处理问题呢。

这时一套及时有效便捷的报警机制显得尤为重要。毕竟早知道,早通知,早处理是解决系统风险的第一要务,越早预警越可以规避不必要的风险。

报警是建立在统计之上进行的,开放平台的统计流程如图。

任何商家任何消息出现连续失败达到一定阈值,就会发出报警,报警内容会以短信方式发送给商家负责人与开放平台研发,如下所示。

未有商家达到失败阈值,但是多位商家失败叠加导致JMQ报警,无法定位商家与接口时,我们有工具可以进行定位:按总失败的量定位风险最大的商家。商家统计节点可以点进入看商家下每个消息接口总失败次数。

知道某个商家某个接口导致的失败报警,经过与商家确认后,不能短时间修复,或者不再订阅的,可以快速禁用此消息(消息将会被丢弃)。

商家得知系统问题后,修复过程中没必要持续报警,还可以手动停止报警(消息仍然保持重试,只停止报警,避免短信费用浪费)。

动态消息发布的产生

从上面核心功能的概念图中可以看出,消息系统是需要订阅大量底层MQ消息的,首先咱们先看一下以前京东到家开放平台BMQ系统中是如何发布一个消息接口的。

同时也可以看下代码维护的情况,BMQ系统中有很多相似的java类,不利于代码的观赏与维护。

总结弊端如下:

1、接入新消息流程繁琐复杂

2、需要耗费最少1名研发的资源和时间

3、每次新消息接入都是重复工作

4、每次新消息接入都需系统上线

为了解决这些问题,开放平台引入动态配置的思路,开放平台的标准消息占大部分,标准消息是和非标准消息相对的一个概念,标准消息就是无论原有消息的内容是什么,最终转化成标准格式,推送内容的字段统一,业务含义标准化。可配置的内容包括简单的业务处理选择,字段映射关系,默认值处理,还有简单的逻辑。可配置的界面如图所示。

字段可配置细节如下图。

消息管理除了基本的增删改功能,还需要通知服务端动态订阅mq(包括停止),这样连listener都不用写了,如果一旦发现有线上问题,还可以做到及时回退版本达到回滚的目的,管理界面如下。

服务端实现动态订阅mq的核心代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ips字段为空为广播所有机器处理,不为空为指定某些机器执行
if (StringUtils.isEmpty(dynamicLoadingMessage.getIps()) || dynamicLoadingMessage.getIps().contains(IPUtil.getIp())) {
  // type=0需要加载的mq,非0需要卸载的mq
  if (dynamicLoadingMessage.getType() == 0) {
    openPlatformBMQEngine.getMessageConsumer().unsubscribe(dynamicLoadingMessage.getTopic());
    openPlatformBMQEngine.getMessageConsumer().subscribe(dynamicLoadingMessage.getTopic(), commonBMQListener);
    LOGGER.error("DynamicLoadingListener->onMessage->subscribe->dynamicLoadingMessage:{}", JsonUtils.toJson(dynamicLoadingMessage));
  } else {
    openPlatformBMQEngine.getMessageConsumer().unsubscribe(dynamicLoadingMessage.getTopic());
    LOGGER.error("DynamicLoadingListener->onMessage->unsubscribe->dynamicLoadingMessage:{}", JsonUtils.toJson(dynamicLoadingMessage));
  }
}

通过以上处理后,发布消息的流程如下。

总结下动态bmq的特点:

1、消息系统平台化

取消原有定制化接入流程,使用规则配置动态解析处理,实现平台化统一入口接入新消息。

2、接入低风险

规避原有定制化手工编写代码上线接入方式,基于规则配置完成消息动态化,动态发布消息从而有效避免开发上线过程中可能导致的风险,从而把风险降到最低。

3、提高接入效率

原有接入流程需要耗费约2个工作日的开发、测试和上线成本,新流程基于动态配置规避原有的开发、测试、上线流程,接入新消息时间缩短至1分钟,后期甚至可达到使非开发人员有能力自行接入。

总结

本篇着重介绍了BMQ系统是如何保证稳定性,易用性及简洁性,从实践的角度结合理论解决了诸多问题,不仅满足了当前系统的实际需要,也可以应对未来一段时间的业务增长需求。从理论的角度上看,平台还有很多不足,在未来的日子里我们也会持续结合实践进行优化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hadoop生态圈各个组件简介
Hadoop 是一个能够对大量数据进行分布式处理的软件框架。具有可靠、高效、可伸缩的特点。
全栈程序员站长
2022/08/31
1.1K0
hadoop生态圈各个组件简介
一文看懂大数据生态圈完整知识体系
随着大数据行业的发展,大数据生态圈中相关的技术也在一直迭代进步,作者有幸亲身经历了国内大数据行业从零到一的发展历程,通过本文希望能够帮助大家快速构建大数据生态圈完整知识体系。 目前大数据生态圈中的核心技术总结下来如图1所示,分为以下9类,下面分别介绍。 1 数据采集技术框架 数据采集也被称为数据同步。 随着互联网、移动互联网、物联网等技术的兴起,产生了海量数据。这些数据散落在各个地方,我们需要将这些数据融合到一起,然后从这些海量数据中计算出一些有价值的内容。此时第一步需要做的是把数据采集过来。数据采集是大
江南一点雨
2022/08/25
1.1K0
一文看懂大数据生态圈完整知识体系
Hadoop生态圈各种组件介绍
好多初入学习大数据的人不是很清楚,今天分享一个图,并介绍一下大致的组件,其他还有一些组件是没有包含在其中的,但是大部分这个图片是有了的。
全栈程序员站长
2022/08/31
2.1K0
Hadoop生态圈各种组件介绍
大数据Hadoop生态圈各个组件介绍(详情)
-coordination and management(协调与管理) -query(查询) -data piping(数据管道) -core hadoop(核心hadoop) -machine learning(机器学习) -nosql database(nosql数据库)
全栈程序员站长
2022/08/31
5.1K0
大数据Hadoop生态圈各个组件介绍(详情)
hadoop生态圈相关技术_hadoop的生态
  最早Doug Cutting(后面被称为hadoop之父)领导创立了Apache的项目Lucene,然后Lucene又衍生出子项目Nutch,Nutch又衍生了子项目Hadoop。Lucene是一个功能全面的文本搜索和查询库,Nutch目标就是要试图以Lucene为核心建立一个完整的搜索引擎,并且能达到提到Google商业搜索引擎的目标。网络搜索引擎和基本文档搜索区别就在规模上,Lucene目标是索引数百万文档,而Nutch应该能处理数十亿的网页。因此Nutch就面临了一个极大的挑战,即在Nutch中建立一个层,来负责分布式处理、冗余、故障恢复及负载均衡等等一系列问题。
全栈程序员站长
2022/11/17
8180
hadoop生态圈相关技术_hadoop的生态
Hadoop及其生态系统的基本介绍【转载】
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
foochane
2019/05/23
5980
Hadoop及其生态系统的基本介绍【转载】
大数据不同的瑞士军刀:对比 Spark 和 MapReduce
翻译 | 古月水语 来源 | 伯乐在线 Apache 基金会下的 Spark 再次引爆了大数据的话题。带着比 Hadoop MapReduce 速度要快 100 倍的承诺以及更加灵活方便的 API,一些人认为这或许预示着 Hadoop MapReduce 的终结。 作为一个开源的数据处理框架,Spark 是如何做到如此迅速地处理数据的呢?秘密就在于它是运行在集群的内存上的,而且不受限于 MapReduce 的二阶段范式。这大大加快了重复访问同一数据的速度。 Spark 既可以单独运行,也可以运行在 Hado
CDA数据分析师
2018/02/24
7270
细谈Hadoop生态圈
Hadoop在过去的几年里已经变得很成熟了。下面的图1-2显示了Hadoop生态系统堆栈。Apache Phoenix是HBase的SQL包装,它需要基本的HBase理解,在某种程度上,还需要理解它原生的调用行为。了解其他Hadoop生态系统组件以及HBase,将有助于更好地理解大数据领域,并利用Phoenix及其最佳可用特性。在本章中,我们将概述这些组件及其在生态系统中的位置。
木野归郎
2020/06/15
1.7K0
细谈Hadoop生态圈
大数据相关开源系统简介汇总
本片博客介绍大数据相关的开源系统以及他们对应的一句话简介, 对于各位想大概了解大数据都有哪些开源系统的同学有帮助。各种相关开源系统简介: 如下是Apache基金支持的开源软件 hdfs 跟GFS类
我是攻城师
2018/05/14
7360
Hadoop体系_集团架构
自从大数据的概念被提出后,出现了很多相关技术,其中对大数据发展最有影响力的就是开源分布式计算平台Hadoop,它就像软件发展史上的Window、Linux、Java一样,它的出现给接下来的大数据技术发展带来了巨大的影响。很多知名公司都加入Hadoop相关项目的开发中,如Facebook、Yahoo等,围绕大数据Hadoop技术产生了一系列大数据的相关技术
全栈程序员站长
2022/11/03
1.1K0
Hadoop体系_集团架构
大数据Hadoop生态圈介绍
Hadoop是目前应用最为广泛的分布式大数据处理框架,其具备可靠、高效、可伸缩等特点。
全栈程序员站长
2022/08/25
1K0
大数据Hadoop生态圈介绍
HADOOP生态圈知识概述
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。具有可靠、高效、可伸缩的特点。
全栈程序员站长
2022/08/31
2.7K0
HADOOP生态圈知识概述
Hadoop Spark Kylin...你知道大数据框架名字背后的故事吗?
对软件命名并不是一件容易的事情,名字要朗朗上口,易于记忆,既不能天马行空,又要代表软件本身的功能和创新。本文将历数几款大数据框架及其创始背后的故事。
PP鲁
2019/12/26
1.5K0
Hadoop Spark Kylin...你知道大数据框架名字背后的故事吗?
HADOOP生态圈简介
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143277.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
7930
HADOOP生态圈简介
Hadoop的生态系统介绍
Hadoop分布式文件系统是Hadoop项目的两大核心之一,是针对谷歌文件系统(GoogleFileSystem,GFS)的开源实现。是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。
全栈程序员站长
2022/08/31
1.2K0
Hadoop的生态系统介绍
Hadoop 生态系统的构成(Hadoop 生态系统组件释义)
现在先让我们了解一下 Hadoop 生态系统的构成,主要认识 Hadoop 生态系统都包括那些子项目,每个项目都有什么特点,每个项目都能解决哪一类问题,能回答这三个问题就可以了(本段属于热身…重在理解 Hadoop 生态系统组成,现状,发展,将来)。
全栈程序员站长
2022/08/26
9310
Hadoop 生态系统的构成(Hadoop 生态系统组件释义)
关于大数据分析系统 Hadoop,这里有13个开源工具送给你
Hadoop是由Apache基金会开发的一个大数据分布式系统基础架构,最早版本是2003年原Yahoo!DougCutting根据Google发布的学术论文研究而来。
IT派
2018/08/10
8090
关于大数据分析系统 Hadoop,这里有13个开源工具送给你
Hadoop生态圈一览
根据Hadoop官网的相关介绍和实际使用中的软件集,将Hadoop生态圈的主要软件工具简单介绍下,拓展对整个Hadoop生态圈的了解。
全栈程序员站长
2022/08/31
1.2K0
Hadoop生态圈一览
大数据常用技术栈
提起大数据,不得不提由IBM提出的关于大数据的5V特点:Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性),而对于大数据领域的从业人员的日常工作也与这5V密切相关。大数据技术在过去的几十年中取得非常迅速的发展,尤以Hadoop和Spark最为突出,已构建起庞大的技术生态体系圈。 首先通过一张图来了解一下目前大数据领域常用的一些技术,当然大数据发展至今所涉及技术远不止这些。
大数据学习与分享
2020/07/24
1.6K0
大数据常用技术栈
0818-7.1.1-如何卸载CDP
以上三种方法也可以只使用于关键数据,具体使用哪种方法,可以根据自己集群的规模和数据量大小具体选择。
Fayson
2020/11/30
1.2K0
0818-7.1.1-如何卸载CDP
相关推荐
hadoop生态圈各个组件简介
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验