您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

消息代理与事件代理:何时使用它们

时间:2023-11-10 12:32:57  来源:  作者:小技术君

选择正确的工具来满足异步处理需求的技术指南

作为后端开发人员,有一天你需要回答这个问题:

 

我需要构建一个使用分布式队列的异步应用程序,我应该使用哪个代理? 作为工程师,我们的本能是列出我们了解或希望熟悉的工具(如果它是一种新的和已知的技术),然后开始使用它。不幸的是,在那个时刻,我们错过了第一个最重要的问题,这个问题需要在所有其他问题之前得到答案:我们的现有和有时未来的用例/需求是什么,什么工具能最好地解决它们? 这是我们在设计一个重要功能时的起点,当时工程师的本能占了上风。我们的第一个问题不是最重要的问题,从那时开始,我们选择正确工具的过程变得不太有效。我们的团队开了几次会,讨论了我们对分布式队列的需求,不同技术的不同限制和特性(来自不同的范例)让关注点远离了我们最重要的需求,也远离了决策和共识的实现。 在那个时候,我们决定回到基本问题,问:我们试图解决的用例是什么,没有让步的余地在哪些领域?一如既往,让我们从需求开始。

 

 

步骤1:明确您要解决的问题以及技术/工具体系结构如何与您的目标和考虑保持一致

在选择消息代理或事件代理时,有很多事情要考虑:高可用性、容错性、多租户、多云区域支持、能够支持高吞吐量和低延迟等等,列举不胜枚举。

大多数情况下,当阅读有关事件代理或消息代理的主要特性时,我们都是以大多数公司或产品从未完全使用或需要的最复杂用例为例的。

作为工程师,生活中有一句常用的话语:

上帝在细节中,但魔鬼隐藏在细节之间。

在选择事件代理与消息代理两个范式之间,"魔鬼"隐藏在更多的低层技术考虑因素中,比如:消息的消耗或生成确认方法、去重、消息的优先级、消费者线程模型、消息的消耗方法、消息的分发/扩散支持、毒药药处理等等。

概念之间的不同:橙子与苹果

步骤2:了解两种范式之间的差异

(1) 事件代理

存储一系列事件。通常,事件会按到达事件代理的顺序附加到日志(队列或主题)上。主题或队列中的事件是不可变的,其顺序不能更改。

当事件发布到队列或主题时,代理识别主题或队列的订阅者,并使事件可供多种类型的订阅者使用。

生产者和消费者不需要彼此熟悉。

事件潜在地可以存储数天或数周,因为它们一旦被成功消耗,就不会从队列/主题中删除。

(2) 消息代理

用于服务或组件之间的通信。它通过异步方式在应用程序之间传输由生产者接收的消息。

它通常支持队列的概念,其中消息通常存储一段时间。队列中消息的目的是在消费者可用于处理消息并在成功消耗后删除消息。

不能保证队列中消息处理的顺序,并且可以更改。

消息代理与事件代理

通常,在处理短命令或面向任务的处理时,我们会倾向于使用消息代理。

例如,假设你在一家电子商务公司工作,想要将新产品添加到公司的网站。这可能意味着多个服务需要知道并以异步方式处理此请求。

消息代理与事件代理:何时使用它们

上图显示了RabbitMQ扇出消息分发的使用,其中每个服务都有自己的队列连接到扇出交换机。

产品服务发送包含新产品信息的消息到交换机,交换机将消息发送到所有连接的队列。

在从队列成功消耗消息后,它将被删除,因为涉及的服务不需要保留或重新处理消息。

在处理当前或历史事件时,通常涉及大量数据,需要以单个或批量方式处理这些数据,我们会倾向于使用事件代理。

例如,假设你在一个娱乐评级网站工作,你想为用户添加一个新功能,用来显示电影的编剧和导演。这些信息虽然历史存储,但不对负责提供这些数据的服务可用。

消息代理与事件代理:何时使用它们

上图显示了使用Kafka作为事件代理,它能够从数据仓库中提取数亿部电影,以为每个服务存储的电影信息附加所需的信息。

Kafka可以在相对短的时间内接受大量的数据,而消费者可以有一个独立的消费者组来单独处理电影主题流。

需要注意的重要方面

正如我之前提到的,选择合适的范式时有很多事情要考虑。

我想讨论一些关键的差异,这些差异通常可能成就或破坏您对技术的决策。

在这一部分,我将比较迄今为止最流行的两种技术:Kafka(事件代理)和RabbitMQ(消息代理),它们分别代表了这两个范式,我对它们都有实际经验。

我强烈鼓励您在技术选择过程中考虑以下几点。

1.轮询与推送

Kafka消费者的工作方式是通过轮询一个主题中按顺序分区划分的消息的块,每个消费者负责从一个或多个分区中消费消息,其中分区用作消费者的并行机制(隐式线程模型)。

这意味着通常负责管理主题的生产者会隐式知道可以订阅主题的消费者实例的最大数量。

消费者负责处理消息处理的成功和失败情况。由于消息是从分区中批量轮询的,所以消息处理顺序在分区级别是有保证的。

RabbitMQ消费者从队列中接收消息的方式是通过代理将消息推送给它们。

每条消息都以一种独立的方式进行处理,消费者可以采用显式线程模型,而不需要生产者知道消费者实例的数量。

成功的消息处理是消费者的责任,而处理失败主要由消息代理完成。

消息分发由代理进行管理。

如延迟消息和消息优先级等功能是开箱即用的,因为消息处理顺序在队列中通常是不保证的。

2.错误处理

Kafka处理消息处理错误的方式是将处理错误的责任委托给消费者。

如果某条消息被处理了几次但失败(毒药药),消费者应用程序需要跟踪处理尝试的数量,然后生成一条消息到一个单独的DLQ(死信队列)主题,以便以后检查/重新运行。

就错误处理而言,消费者是承担所有责任的一方。

这意味着如果您希望具有重试/DLQ功能,您需要提供重试机制,并在发送消息到DLQ主题时充当生产者,这在某些极端情况下可能导致消息丢失。

RabbitMQ处理消息处理错误的方式是跟踪处理消息失败。一旦一条消息被视为毒药药,它将被路由到一个DLQ交换机。

这允许重新排队消息或将其路由到专用DLQ以进行检查。

通过这种方式,RabbitMQ提供了保证未成功处理的消息不会丢失。

3.消费者确认和传递保证

Kafka处理消费者确认的方式是由消费者提交从主题分区中轮询的消息的偏移量。

开箱即用,Kafka客户端会自动提交偏移量,无论消息是否成功处理,这可能导致消息丢失,如下图所示。

消息代理与事件代理:何时使用它们

通过消费者代码负责手动提交获取的消息的偏移量,包括处理消息消费失败的情况,可以更改此行为。

RabbitMQ处理消费者确认的方式是消费者以每条消息的方式进行“确认”或“否认”,允许由消息代理处理重试策略/DLQ,如果需要,可以由消息代理进行管理。

开箱即用,RabbitMQ客户端自动进行确认,无论消息是否成功处理,可以通过消费者端的配置手动控制确认,允许消息在失败/超时时重新推送给消费者。

RabbitMQ和Kafka在大多数情况下都提供至少一次消息/事件处理的保证,这意味着消费者应该是幂等的,以处理同一消息/事件的多次处理。

我们的流程

步骤 3:根据您的用例选择技术,而不是反过来

对我们来说,最重要的部分是编制我们解决方案的技术标准清单,并为我们作为团队和产品不能缺少的要求分配“不可接受”。

回到基础精神,我使用了一个普通的表格来编制和比较不同的标准,并提到了一些需要注意的地方。记住,“细节藏在细节之中”。

消息代理与事件代理:何时使用它们

这真的帮助我们组织并集中精力关注对我们至关重要的内容以及我们无法缺少的内容。

例如,我们的“不可接受”要求之一是,如果在处理过程中发生错误,我们不能承受丢失消息。

正如您可能从上面的部分中记得的,当使用需要DLQ的Kafka时,消费者也是DLQ的生产者。这意味着在消费者发生故障的某些情况下,消息将不会被发送到DLQ主题,可能导致消息丢失。

在这一点上,正如您可能已经猜到的那样,我们决定选择消息代理。

我们的功能包括面向命令/任务的处理用例,消息代理满足了我们的产品/数据容量要求,也满足了我们团队的需求。

最后的思考

消息和事件流生态系统包括许多解决方案,每个解决方案都有许多不同的方面需要考虑和熟悉。

重要的是我们要睁大眼睛进入每个生态系统,并对这些不同的范式有清晰的理解。它们将对我们工程师的日常生活(有时是夜间生活)产生重大影响。



Tags:消息代理   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01  Search: 消息代理  点击:(57)  评论:(0)  加入收藏
消息代理与事件代理:何时使用它们
选择正确的工具来满足异步处理需求的技术指南作为后端开发人员,有一天你需要回答这个问题: 我需要构建一个使用分布式队列的异步应用程序,我应该使用哪个代理? 作为工程师,我们的...【详细内容】
2023-11-10  Search: 消息代理  点击:(225)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条