首页 文章 精选 留言 我的

精选列表

搜索[电商],共10002篇文章
优秀的个人博客,低调大师

每日一博 | Apache Dolphinscheduler 在生鲜电商领域的落地实践

点亮 ⭐️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 精彩回顾 近期,食行生鲜的数据平台工程师单葛尧在社区线上 Meetup 上给大家分享了主题为《Apache Dolphinscheduler在食行生鲜的落地实践》的演讲。 随着大数据的进一步发展,不管是离线任务量还是实时任务量都变得越来越多,对调度系统的要求也越来越高,不仅要求系统稳定还要求操作简单,上手方便。 而 Apache Dolphinscheduler 就是当下非常流行且好用的一款调度系统。首先它是分布式运行且是去中心化的,其次有一个非常好的页面,使得调度的任务变得非常容易上手。 讲师介绍 ​ 单葛尧 食行生鲜 数据平台工程师 文章整理:硕磐科技-刘步龙 今天的演讲会围绕下面三点展开: 背景介绍 实施落地 元数据系统 Datahub 与 Dolphinscheduler 集成 背景介绍 我司食行生鲜是一家采用“预订制”模式,通过全程冷链配送和社区智能冷柜自提方式,为用户提供优质生鲜服务的新零售企业。 随着业务发展,大量的离线同步及计算任务开始对我们的数据架构的易用性与稳定性带来了挑战。 01 数据架构 ​ 上图是我们目前的基础架构体系,主要是批处理和流处理。批处理主要是以 Hive 和 Spark 为主的的全量数仓的分级计算。流处理以 Flink 为主,主要用于用户轨迹实时 ETL 和实时业务监控,目前采用美柚开源的巨鲸平台,后续会陆续迁移 Apache 新晋项目 StreamPark 中,它支持多个版本的 Flink,提供一系列开箱即用的连接器,大大减轻了开发部署实时任务的复杂度。 我们的数据来源有 MySQL、PostgreSQL、物流供应链端的 SQLServer 数据、同行的数据及风控类的数据。相对应的日志类数据非常多且复杂,故数据类型也多种多样。 我们的业务主体有两种:业务产生的数据,比如说用户去下单,用户的各种余额,积分优惠券;**埋点系统的轨迹数据,**比如说用户的点击、下单、进入商品详情等行为轨迹类操作; 一般来说,T+1的数据采用离线计算,轨迹数据用的是实时计算。 抽数工具是以 Sqoop 为主,其次是 binlog 消费,对于部分不支持的数据源,就用了 Apache SeaTunnel。 经过数仓的复杂计算之后,我们的下游数据的 OLAP 场景主要以 TiDB 和GreenPlum 为主。 TiDB 运用于业务的查询,比如查询近7日某商品的购买量; GreenPlum 主要以内部的看板为主。比如集团核心的财务指标,运营部门的运营成果及绩效指标; 另外会用 HBase 存储一些维度数, ElasticSearch 存储一些算法模型训练出的画像结果。 **Kylin 用于指标体系。**它服务于我们内部的指标计算。比如站点状态的监控,展现业务成果的各维度。比如今天的实时订单情况,是否需要向供应链增派人力,最近下单的数据流向是否有猛增等现象,以此来调整销售策略。 02 DMP的能力与组成 任务数量随着业务发展日益增长,数据资产的管理、数据质量的监控等问题愈发严峻,DMP(Data Management Platform)的需求应运而生。 ​ 一般而言,DMP 衍生出数据应用,数据应用包括以下能力: **决策支持类:**主题报表(月度/季度/年度/专题)、舆情监控、热点发现、大屏数据可视化展示等; **数据分析类:**交互式商业智能、OLAP分析、数据挖掘、数据驱动的机器学习等; **数据检索类:**全文检索、日志分析、数据血缘分析、数据地图等; **用户相关:**用户画像服务、用户成长/流失分析及预测、点击率预测、智能推荐等; **市场相关:**数据服务于搜索引擎、数据服务于推荐引擎、热点发现、舆情监控等; **制造生产相关:**预测性维护、生产过程实时数据监控、数字孪生等; 实施落地 日益增长的业务系统数据催生了对调度系统的高可用要求,原有自研的单节点调度系统不再适合我们当前的业务体量。 我们开始在市面上调研新的调度工具,然而我们不仅需要调度系统是分布式高可用,还能简单易用,对无编程经验的分析师们提供友好的交互体验,对开发人员也可以支持高扩展性,便于后期可以随着业务增长良好的扩展其可支持的任务类型及集群规模。 01 选择Apache DolphinScheduler ​ 最终我们选择了海豚调度,然而对于我司调度系统的发展经历了几个工具的迁移。 最开始用的是 Azkaban ,因为一些历史原因,后续弃用了 Azkaban ;随后自研了一套调度系统,而随着业务数据的激增,自研系统存在的一个致命问题:该系统为单点式,没有办法扩展资源,只能单机运行; 去年六月份,我们对 AirFlow 和 Dolphinscheduler 做了一个调研。面对业务场景,我们希望以 SQL 的形式去定义 flow ;希望系统以分布式的形式运行,而不是单机,以此来解决单机的瓶颈问题; AirFlow 的技术栈是 Python,而公司主要是以 Java 为主; 经过比较,我们最终选择了 Dolphinscheduler 。 02 实施落地 去年6月,首次在生产环境接入了 DolphinScheduler 的1.3.6版本,经过业务的锤炼与社区的共建,现已成功更新至3.0.0,至今服务于我司一年有余,平均每日稳定运行6000+任务。 03 任务执行 ​ 我们在使用 DolphinScheduler 时,主要使用其 Shell 组件,内部封装了 Hadoop 相关 Tools ,用来通过 Shell 提交相关 SQL ,并指定任务提交的 Yarn 资源队列。 我们根据 DolphinScheduler 内部的五个优先级 HIGHEST、HIGH、MEDIUM、LOW、LOWEST 也分别创建了五个对应的 Yarn 资源队列,便于根据流程的优先级提交到指定的优先级队列,更好的去利用并分配资源。 在原有的 Worker 线程池的等待队列中,把从原有的 LinkedBlockingQueue 转换 PriorityBlockingQueue ,以实现超 Worker 其 exec-threads 时可以依照其设定的优先级重新排序,实现高优先级任务在出现异常时,可以在资源较满的情况下实现“插队”效果。 04 告警策略 DolphinScheduler 提供了开箱即用的多种告警组件。 Email 电子邮件告警通知 DingTalk 钉钉群聊机器人告警,相关参数配置可以参考钉钉机器人文档。 EnterpriseWeChat 企业微信告警通知相关参数配置可以参考企业微信机器人文档。 Script 我们实现了 Shell 脚本告警,会将相关告警参数透传给脚本,在 Shell 中实现相关告警逻辑,如果需要对接内部告警应用,这是一种不错的方法。 FeiShu 飞书告警通知 Slack Slack告警通知 PagerDuty PagerDuty告警通知 WebexTeams WebexTeams告警通知 相关参数配置可以参考WebexTeams文档。 Telegram Telegram告警通知 相关参数配置可以参考Telegram文档。 HTTP Http告警,调用大部分的告警插件最终都是Http请求。 根据 Alert SPI 的设计,为其扩展了两个插件:内部OA通知+阿里云电话告警,以保证服务的可用性及数据产出的及时性。 DolphinScheduler 的 Alert SPI 设计的相当优秀,我们在新增插件时,只需关注扩展 org.apache.dolphinscheduler.alert.api.AlertChannelFactory 即可。 另外,DolphinScheduler 的告警覆盖场景也相当广泛,可以根据工作流及任务的平时的完成时间来设置超时时间,与新出的数据质量模块相结合,可以较好的保证数据的及时性与准确性。 元数据系统 Datahub与 Dolphinscheduler 集成 Datahub由 LinkedIn 开源,原来叫做 WhereHows 。经过一段时间的发展 Datahub 于2020年2月在 Github 开源,首先简单介绍一下 Datahub 这个系统。 01 总体架构 DataHub 是一个现代数据目录,旨在实现端到端的数据发现、数据可观察性和数据治理。 这个可扩展的元数据平台是为开发人员构建的,以应对其快速发展的数据生态系统的复杂性,并让数据从业者在其组织内充分利用数据的价值。 ​ 02 搜索元数据 DataHub 的统—搜索支持跨数据库、数据湖、BI平台、ML功能存储、编排工具等显示结果。 支持的 Source 相当丰富,目前截止v0.8.45已有 Airflow、Spark、Great Expectations、Protobuf Schemas、Athena、Azure AD、BigQuery、Business Glossary.ClickHouse.csv、dbt、Delta Lake、Druid、ElasticSearch.Feast、FileBased Lineage、File、Glue.SAP HANA、Hive、lceberg.Kafka Connect、Kafka、LDAP、Looker、MariaDB、Metabase、Mode、MongoDB、MicrosoftsQLServer、MySQL、Nifi、Okta、OpenAPI、Oracle,Postgres、PowerBl、Presto onHive、Pulsar、Redash.Redshift、S3 Data Lake.SageMaker、Salesforce、Snowflake、Other SQLAlchemydatabases、Superset.Tableau、Trino、Vertica等。 03 血缘支持 可通过跨平台、数据集、ETL/ELT管道、图表、仪表板等跟踪血缘,快速了解数据的端到端的流向。 与市面上其他元数据系统不—样的是,Datahub 一直支持从数据集到B看板的整个流向的追踪,已经为我们提供了如 Redash、SuperSet 之类开源看板的元数据接入。 ​ 04 元数据的抽取步骤 **第一步:**开启元数据采集和创建密钥的权限; **第二步:**选择所摄取血缘的数据源(除了当前所支持的外,也支持自定义); **第三步:**配置采集血缘的表以及下游走向; **第四步:**设置时区与定时,元数据采集就会像我们的调度系统一样,定时调取完成采集。 05 Metadata Ingestion架构 Pull-based lntegration DataHub 附带一个基于 Python 的元数据摄取系统,该系统可以连接到不同的源以从中提取元数据。然后,此元数据通过 Kafka 或 HTTP 推送到 DataHub 存储层。元数据摄取管道可以与 Airflow 集成,以设置计划摄取或捕获血缘。 Push-based Integration 只要您可以向 Kafka 发出元数据更改建议(MCP)事件或通过 HTTP 进行 REST 调用,您就可以将任何系统与 DataHub 集成。 为方便起见,DataHub 还提供简单的 Python 发射器供您集成到系统中,以在源点发出元数据更改(MCP-s)。 ​ 06 Datahub与Dolphinscheduler集成 方案一 通过 Kafka 作为 MetadataChangeEvent 发出简单的 dataset 到 dataset 的血缘 import datahub.emitter.mce_builder as builder **方案二:**通过Rest去emit血缘关系。 import datahub.emitter.mce_builder as builder 上述形式适用于所有 dataset 到 dataset 的血缘关系构建,可以在任何数据集处理下使用。 后续在社区的贡献计划 01 对流处理的支持(flink stream与debezium) 在社区PMC蔡顺峰的帮助下,**现在已经完成了对流任务的初步集成,**可以通过 Flink sdk 去提交任务到 Yarn ,可视化的启动、停止、Savepoint,直观的在列表里看到任务的 Yarn Application ID 和 Job ID 等信息。 接下来的TODO LIST顺峰已经写在 related items 里 flink 集群管理 支持 flink sql 增加 flink 的metric 支持其他流任务(如 kafka connector) 事件驱动调度(最终目标) ​ 02 与版本管理工具的集成(GIT与SVN) ​ 社区确实是能人辈出,我们准备的这个 RoadMap ,我不仅在 DSIP 里找到了提案,而且提案还提到了以下几个资源插件: GitHub GitLab Amazon S3 AliCloud OSS 当然,基于底层 Decorator implementation 的存在,该 Resource Plugin 会非常的易于扩展。 当时在准备 Data Quality 相关开发时,就惊喜的发现社区提供了相关的提案,我们仅是在3.0.0上稍作改动,就投入了生产环境的使用,提供了我们数据准确性、及时性等多重保障。 我们后期准备在该基础上扩展社区的 HiveCli 插件,并把我们目前的工程逐步从 SVN 迁移到 Git 上,以摆脱目前纯 Shell 使用,让分析师们更关注于业务。 03 更好的与yarn集群及队列的管理与使用 我司目前的所有资源调度都是基于 Yarn 的,包括所有的 MapReduce、Spark及Flink 任务,统一都由 Yarn 来管理。 由于历史遗留原因及测试生产环境的隔离等因素,目前集群存在多套 Yarn 环境,每个 Yarn 的资源总量及策略配置各不相同,导致管理困难。 再者,基于 DolphinScheduler 设计来看,Yarn 队列与执行的用户绑定,用户来定义默认的租户及提交队列。这个设计不太符合生产环境的要求,租户来定义数据的权限,队列来定义任务的资源,后面我们会把队列单独作为一个配置或是直接把提交队列和任务的优先级绑定。 Yarn 环境的多套集群管理,可以后期远程提交任务到指定集群,来替换掉目前的方案,后期可以在调度里可以直接监控调度系统里的任务在 Yarn 的一些运行状态。 04 更好的与DataHub的集成 ​ 给大家提供一个好用的Python插件,SqlLineage,可解析SQL语句中的信息。 给定一个 sql 语句,sqllineage 将告诉您源表和目标表。如果您想要血缘结果的图形可视化,可以切换它的切换图形可视化选项,此时就会启动一个 web ,在浏览器中显示血缘结果的 DAG 图,目前我司基于此组件解析了我们版本管理工具下的所有 sql ,在此基础上构建了我们的上下游血缘。 后期我们将会依照 Datahub 的 Airflow 组件功能,扩展开发 Datahub 的 Dolphinscheduler 元数据组件。 [lineage] Datahub 的 Airflow 血缘配置如上所示,可以发现 Datahub 为 Airflow 提供了开箱即用的 acryl-datahub[airflow] 插件,提供以下功能: Airflow Pipeline (DAG) metadata DAG and Task run information Lineage information when present 我们会扩展 Dolphinscheduler 的 Python Gateway 能力,后续将会回馈到社区,希望可以为大家提供更好的元数据系统集成体验。 参与贡献 随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。 参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括: 贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。 社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689 非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A"volunteer+wanted" 如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html 来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

优秀的个人博客,低调大师

RabbitMQ 高可用集群搭建及电商平台使用经验总结

面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ plugin 大型应用插件(Sharding、Rederation) Queue镜像失败手动同步 各集群配置同步方式(RabbitMQ export\import) 客户端连接方式(尽量采用AMQP组来动态链接) RabbitMQ 产线二次产品化封装(消息补偿、发送消息持久化、异常处理、监控页面、重复消息剔除) 1.面向EDA(事件驱动架构)的方式来设计你的消息 在通常情况下你在使用消息中间件的时候,都是未经设计的使用,你没有把应用架构和系统架构边界搞清楚。消息中间件只是一个纯粹的技术工具,当你引入的时候是站在应用架构的角度引入的。这是架构的角度,也是架构的上帝视角,这样你就不会用到最后发现越来越混乱,而且也无法结合软件模式、方法论、最佳实践来综合提升系统的架构能力。 EDA(Event Driven Architecture,EDA) 事件驱动架构,它是一种用来在SOA或者Micro service中进行的架构模式。它的好处有几个,柔性具有很高的伸缩性。 (具体参考本人的SOA架构文章:SOA架构设计经验分享—架构、职责、数据一致性) 既然要EDA就要规划好你当前的系统边界之内有多少业务实体,这些实体是围绕着领域模型而得来。所以这里不要很主观的就定义一些你认为的事件,这些事件要根据业务实体中的对象来设计。业务实体起码是有唯一Identity的。比如,订单、商品,围绕着这些实体展开,订单可能有几个状态是比较常用的,创建、支付、配送、取消。商品可能有价格、关键属性修改等等。这些实体的抽象和提炼取决于你当前的业务。 (有关这方面内容可以参考:《领域驱动设计》、《探索CQRS和事件源》) 这些是相对理论的指导思想,有了这些之后你可以落地你的Rabbitmq,这样你就不会跑偏了。比如,你的消息名称不会是看起来没结构和层次的,deliveryMssage(配送消息)。而是应该,order.delivery.ondeliveryEvented(订单.配送.配送完成事件)这样的结构。 当你的层次结构不满足业务需求的时候,你可能还需要进一步明确事件范围,order.viporder.delivery.ondeliveryEvented(订单.VIP订单.配送.配送完成事件)。 上图是一个事件驱动的基本场景,它最瞩目的几个特性就是这几个,首先是异步化的,可以大大提高系统的抗峰值能力。然后就是解耦,这不用说了,设计模式里的观察者模式没有人不知道它的好处。伸缩性,可以按需scaleout,比如rabbitmq的node可以很方便的加入。最终一致性解决了分布式系统的CAP定理的问题。 2.AMQP routing key的设计 AMQP协议中约定了routing key的设计和交互。为了实现订阅发布功能,我们需要某种方式能够订阅自己所感兴趣的事件。所以在AMQP中的Binding中,可以根据routing key来进行模式匹配。所以,这里可以结合amqp routingkey与领域事件,发出来的事件就相当于amqp中的routingkey,这样可以完美的结合起来。 你的事件肯定是随着业务发展逐渐增加的,而这个事件集合也没办法在一开始就定义清楚,所以这里有一个需要注意的就是,绑定的时候千万不要写死具体的routing key。比如,order.delivery.OnDeliveryEvented,这是订单配送,此时你Binding的时候routingkey就写成了”order.delivery.OnDeliveryEvented”。未来订单事件一扩展,就会很麻烦,不相关的事件都被订阅到,无法细化或者事件你无法获取到,因为routingkey改变了。所以在绑定的时候记住具体点绑定,也就是借助字符串的模式匹配绑定,比如,*.delivery.*,*.onDeliveryEvented”这样。将来越来越多的routingkey和event出来都不会影响你的绑定。你只需要根据自己的关心程度,绑定在事件的不同层级上即可。 上图中,orderBinding绑定了order事件,它订阅了顶级事件,也就是说未来任何类型的订单都可以被订阅到,比如,order.normalorder.delivery.onDeliveryEvent也可以被订阅到。而viporderBinding订阅了viporder事件,如果发送了一个order.normalorder.delivery.onDeliveryEvent就跟它没关系了。 3.RabbitMQ cluster搭建 搞清楚了应用架构的事情,我们开始着手搭建RabbitMQ cluster。rabbitmq这款AMQP产品是用erlang开发的,那么我们稍微介绍下erlang。 我第一次正式接触erlang就是从rabbitmq开始的,一开始并没有太多感觉到特别的地方,后来才明白越明白越发现挺喜欢这门语言的。喜欢的理由就是,它是天然的分布式语言。这句话说起来好像挺平常的,但是当你明白了.erlang.cookie机制之后才恍然大悟。瞬间顿悟了,为什么要用erlang来搞rabbitmq,而是它真的很适合信息交换之类的软件。erlang是爱立信公司开发的专门用来开发高性能信息交换机的,想想也会觉得那些软件的性能和稳定性要求是极高的。RabbitMQ的节点发现和互连真的很方便,这在erlang的虚拟机中就集成了,而且具有高度容错能力。反正我对它很有好感。 还有一点值得骄傲的是RabbitMQ是伟大的pivotal公司的,你应该知道pivotal公司是干什么的,如果你还不清楚建议你立刻google下。 一开始我并没有太关注他们的copyright,后来对pivotal公司越来越佩服之后突然看到原来RabbitMQ也是他们家的,突然信心倍增。这就是影响力和口碑,看看人家公司的spring、springboot、spring cloud,佩服的五体投地。(RabbtiMQ 官网:http://www.rabbitmq.com/) 3.1.安装erlang & RabbitMQ 要想安装RabbitMQ,首先需要安装和配置好它的宿主环境erlang。去erlang官网下载好erlang otp_src源码包,然后在本地执行源码安装。(erlang官网:http://www.erlang.org/) 由于我本机已经下载好了otp_src源码包,我是使用的otp_src_19.1版本。下载好之后解压缩,然后进入目录,执行./configure --prefix=/usr/erlang/,进行环境的检查和安装路径的选择。如果你提示“No curses library functions found”错误,是因为缺少curses库,yum install –y ncurses-devel。安装后在进行configure。 如果没有报错的话,就说明安装成功了。你还需要配置下环境变量: export PATH=$PATH:/usr/erlang/bin source /etc/profile 此时使用erl命令检查下erlang是否能正常工作了。 接下来安装RabbitMQ,去官网下载运行的包就行了。 同样要配置下环境变量,这样你的命令才能被系统查找到。然后运行rabbitmq实例。 这里有一个需要注意,记得配置下hosts,在127.0.0.1里加上本机的名称。erlang进程需要host来进行连接,所以它会检查你的hosts配置。还需要设置下防火墙,三个端口要打开。15672是管理界面用的,25672是集群之间使用的端口,4369是erlang进程epmd用来做node连接的。 我配置了两个节点,192.168.0.105、192.168.0.107,现在已经全部就绪。我们添加原始账号进入rabbitmq管理界面。 3.2.配置RabbitMQ cluster 先保证你的各个rabbitmq节点都是可以访问的,且打开rabbitmq_management plugin,这样可以当出现某个节点挂掉之后可以切换到其他管理界面查看情况或者管理。 打开管理界面插件: rabbitmq-plugins enable rabbitmq_management 添加账号: rabbitmqctl add_user admin admin 添加 权限tag rabbitmqctl set_user_tags admin administrator 保证两个节点都是可以正常工作的。下面我们就将这两个节点连接起来形成高可用的cluster,这样我们就可以让我们的exchange、queue在这两个节点之间复制,形成高可用的queue。 cd 到你的home目录下,我是在root下,里面有一个隐藏的.erlang.cookie文件,这就是我在前面介绍erlang时候提到的,这个文件是erlang用来发现和互连的基础。我们需要做的很简单,将两个节点中的.erlang.cookie设置成一样的。这是erlang的约定,一样的cookie hash key他认为是合法和正确的连接。 .erlang.cookie默认是只读的,你需要修改下写入权限,然后复制粘贴下cookie 字符串即可。 chmod u+w .erlang.cookie 配置好了之后接下来配置hosts文件,erlang会使用hosts文件里的配置去发现节点。 vim /etc/hosts 192.168.0.107 rabbitmq_node2 192.168.0.105 rabbitmq_node1 保证同样的配置在所有的节点上都是相同的。验证你配置的正确不正确你只需要在你的机器上ping rabbitmq_node1,试下请求的ip是不是你配置的即可。按照DNS的请求原理,hosts是最高优先权,除非浏览器有缓存,你直接用ping就不会有问题的。 选择一个节点stop,然后连接到另外节点。 rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@rabbitmq_node2 Clustering node rabbit@rabbitmq_node1 with rabbit@rabbitmq_node2 ... rabbitmqctl start_app 节点已经连接成功。 默认情况下节点占用的memory是总内存的40%,可以根据自己的用途仔细研究rabbitmq的配置项。为了提高性能,不需要两个节点都是disc的节点,所以我们需要启动一个节点为RAM模式。 rabbitmqctl change_cluster_node_type ram 改变rabbitmq_node1为内存节点模式。 4.Mirror queue policy设置 节点是准备好了,接下来我们需要设置exchange、queue 高可用策略,这样才能真的做到高可用。现在是物理上的机器或者说虚拟机节点是高可用的,但是里面的对象需要我们进行配置策略。 RabbitMQ支持很好的策略模式,需要管理员才能操作。 首先我们需要创建一个属于自己业务范围内的vhost,标示一个逻辑上的独立空间,所有的账号、策略、队列都是强制在某个虚拟机里的。我创建了一个common vhost。 开始添加policie。 最主要是Apply to ,可以作用在exchange或者queues上,当然也可以包含这两个。策略选择还是比较丰富的,最常用的是HAmode,还有MessageTTL(消息的过期时间)。这些策略按照几个维度分组了,有跟高可用相关的,有Federation(集群之间同步消息)相关的 ,有Queue相关的,还有Exchange相关的。可以根据的业务场景进行调整。 我们定义了策略的匹配模式.order.,这样可以避免将所有的exchange、queue都镜像了。 我们新建了一个ex.order.topic exchange,它的features中应用了exchange_queue_ha策略。(相同的策略是无法叠加使用的。)其他的exchange并没有应用这个策略,是因为我们的pattern限定了只匹配.order.的名称。 创建一个qu.order.crm queue,注意看它的node属性里有一个”Synchronised mirrors:rabbit@rabbitmq_node2“镜像复制。features里也应用了exchange_queue_ha策略。这个时候,队列其实在两个节点里都是有的,虽然我们创建的时候是在rabbit@rabbitmq_node1里的,但是它会复制到集群里的其他节点。在创建HAmode的时候可以提供HA params参数,来限定复制节点的个数,这通常用来提高性能和HA之间的平衡。 5.两个不错的RabbitMQ plugin 大型应用插件(Sharding、Rederation) 在rabbitmq-plugins中有两个plugin还是可以试着研究研究的。rabbitmq-plugins list。 rabbitmq-plugins list Configured: E = explicitly enabled; e = implicitly enabled | Status: * = running on rabbit@rabbitmq_node1 |/ [e*] amqp_client 3.6.5 [ ] cowboy 1.0.3 [ ] cowlib 1.0.1 [e*] mochiweb 2.13.1 [ ] rabbitmq_amqp1_0 3.6.5 [ ] rabbitmq_auth_backend_ldap 3.6.5 [ ] rabbitmq_auth_mechanism_ssl 3.6.5 [ ] rabbitmq_consistent_hash_exchange 3.6.5 [ ] rabbitmq_event_exchange 3.6.5 [ ] rabbitmq_federation 3.6.5 [ ] rabbitmq_federation_management 3.6.5 [ ] rabbitmq_jms_topic_exchange 3.6.5 [E*] rabbitmq_management 3.6.5 [e*] rabbitmq_management_agent 3.6.5 [ ] rabbitmq_management_visualiser 3.6.5 [ ] rabbitmq_mqtt 3.6.5 [ ] rabbitmq_recent_history_exchange 1.2.1 [ ] rabbitmq_sharding 0.1.0 [ ] rabbitmq_shovel 3.6.5 [ ] rabbitmq_shovel_management 3.6.5 [ ] rabbitmq_stomp 3.6.5 [ ] rabbitmq_top 3.6.5 [ ] rabbitmq_tracing 3.6.5 [ ] rabbitmq_trust_store 3.6.5 [e*] rabbitmq_web_dispatch 3.6.5 [ ] rabbitmq_web_stomp 3.6.5 [ ] rabbitmq_web_stomp_examples 3.6.5 [ ] sockjs 0.3.4 [e*] webmachine 1.10.3 rabbitmq_sharding、rabbitmq_federation,rabbitmq_sharding的版本有点低了,github地址:https://github.com/rabbitmq/rabbitmq-sharding Rederation 可以用来进行跨cluster或者node之间同步消息。http://www.rabbitmq.com/federated-exchanges.html 这个用来在不同的domain之间传递消息还是个不错的解决方案,跨机房或者跨网络区域,订阅别人的rabbitmq消息始终不太稳定,可以用这种方式来传递消息。 6.Queue镜像失败手动同步 有时候可能由于各种原因导致queue mirror失败,这个时候可以手动进行同步,而不是像其他分布式系统来重启节点或者重建数据。 这个还是比较方便的,有时候总有那么几个小问题需要你手动处理的。 7.各集群配置同步方式(RabbitMQ export\import) 各个环境的集群配置同步也是个日常运维的问题,还好RabbitMQ也提供了相关工具。 8.客户端连接方式(尽量采用AMQP组来动态链接) 由于RabbitMQ是AMQP协议的实现,所以在进行远程连接的时候尽量采用amqp协议的方式连接。 var amqpList = new List<AmqpTcpEndpoint> { new AmqpTcpEndpoint(new Uri("amqp://192.168.0.105:5672")), new AmqpTcpEndpoint(new Uri("amqp://192.168.0.107:5672")) }; 关于集群的vip方案其实也是需要综合考虑的,如果是统一的地址会面临三个问题,DNS、LoadBalance、VIP,这三个点都有可能导致集群连接不上。现在越来越多的方案倾向于在客户端做负载和故障转移,这有很多好处,消除了中间节点带来的故障概率。如果这三个点加在一起出现的可用性指标肯定是比直接在客户端连接的低的多。 我们碰到最多就是VIP的问题,这类系统的VIP不同于数据库,数据库的master\slave大多都是要人工check后才切换,不会随便自动的切换主从库。而非数据库的VIP大多都是Keepalived自动检测切换,这带来一些列问题,包括连接重试、心跳保持。这只是VIP的出错场景之一。还有LoadBalance带来的问题,DNS出错的可能性也是很大。所以我倾向于使用客户端来做这些。 有几个地方很重要,第一个就是消息的Persistent持久化状态要带上,第二个就是ContentType,这个属性很实用,方便你查看消息的正文。 如果没设置,默认是null。 第三个就是AutomaticRecoveryEnabled,自动连接重试,这致命重要。当上面的VIP切换之后这个可以保命。第四个就是TopologyRecoveryEnabled,重新恢复Exchange、queue、binding。在出现网络断开之后,一旦恢复连接就会恢复这些设置以保证是最新的设置。 9.RabbitMQ 产线二次产品化封装(消息补偿、发送消息持久化、异常处理、监控页面、重复消息剔除) 不管rabbitmq保证的多么强壮,多么高可用,记住一定要有备用方案。 在之前我写了一篇文章,WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能 说了就是消息的持久化和补偿。 一旦将发送和接受的消息持久化之后我们能做到事情就比较多了。消息补偿是可以做的,异常也不用担心。但是在发送消息的时候一定要注意,是先持久化消息在业务逻辑处理。为了应对特殊活动的监控,还可以开发一定的业务来监控消息的接受和处理的数量,然后自动补偿。 在开发补偿程序的时候有一个逻辑挺饶人的,当你对某一个消息进行补偿的时候会多出发送消息,而接受的消息肯定是比你发送的少。所以你在统计的时候记得DISTINCT下。 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/1881540,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册