在为微做事利用异步通信时,常日利用代理。代理确保不同微做事之间的通信可靠稳定,在系统内得到管理和监控,并且不会丢失。您可以从几个代理中选择,它们的规模和数据功能各不相同。这篇博文将比较三个最受欢迎的代理brokers:RabbitMQ、 Kafka 和 Redis 。
但首先,让我们理解一下微做事通信。
微做事之间有两种常见的通信办法:同步和异步。在同步通信中,调用方在发送下一条之前等待相应,它作为HTTP之上的REST协议运行。相反,在异步通信中,是在不等待相应的情形下发送的。这适用于分布式系统,常日须要代理来管理。

您选择的通信类型应考虑不同的参数,如如何布局微做事、设置什么根本举动步伐、延迟、规模、依赖性和通信目的。异步通信的建立可能更加繁芜,并且须要向堆栈中添加更多的组件,但是将异步通信用于微做事的优点大于缺陷。
异步通信上风首先也是最主要的是,异步通信从定义上讲是无壅塞的。它还支持比同步操作更好的扩展。第三,在微做事崩溃的情形下,异步通信机制供应了各种规复技能,常日更好地处理与崩溃干系的缺点。此外,当利用代理而不是REST协议时,吸收通信的做事实际上不须要相互理解。乃至可以在旧做事运行很永劫光后引入新做事,即更好的解耦做事。
末了,在选择异步操作时,您可以提高将来创建中央创造、监视、负载平衡乃至策略履行器的能力。这将为您的代码和系统构建供应灵巧性、可伸缩性和更多功能。
选择精确的代理
异步通信常日通过代理进行管理。还有其他方法,比如aysncio,但它们更为稀缺和有限。
在选择实行异步操作的代理时,应考虑以下几点:
1. Broker Scale–系统中每秒发送的数。
2. 数据持久性–规复的能力。
3. 消费者能力–brokers是否能够管理一对一和/或一对多消费者。
一对一:
一对多:
我们查看了最新和最好的做事,以找出这三个种别中哪家供应商最强。
比较不同的代理RabbitMQ(AMQP)规模:根据配置和资源,这里的大概速率约为每秒50K为精。
持久化:支持持久性和暂时性。
一对一vs一对多消费者:两者皆有。
RabbitMQ于2007年发布,是首批创建的通用代理之一。它是一个开源软件,通过实现高等行列步队协议(AMQP),通过点对点和发布的方法来通报。它旨在支持繁芜的路由逻辑。
有一些托管做事许可您将其用作SaaS,但它不是本机紧张云供应商堆栈的一部分。RabbitMQ支持所有紧张措辞,包括Python、Java、.NET、PHP、Ruby、JavaScript、Go、Swift等。
在持久模式下可能会涌现一些性能问题。
Kafka规模:每秒最多可发送数百万条。
持久化:是的。一对一vs一对多消费者:只有一对多(乍一看彷佛很奇怪,对吧?!
)。
Kafka由Linkedin于2011年创建,用于处理高吞吐量、低延迟的处理。作为一个分布式流媒体平台,Kafka复制了发布-订阅做事。它供应数据持久性并存储记录流,使其能够交流高质量的。
Kafka在Azure、AWS和Confluent上管理SaaS。他们都是Kafka操持的创造者和紧张贡献者。Kafka支持所有紧张措辞,包括Python、Java、C/C++、Clojure、.NET、PHP、Ruby、JavaScript、Go、Swift等。
Redis规模:每秒最多可发送一百万条。
持久化:基本上不是——它是内存中的数据存储。
一对一vs一对多消费者:两者皆有。
Redis与其他代理稍有不同。Redis的核心是内存中的数据存储,可以用作高性能键值存储或代理。另一个差异是Redis没有持久性,而是将其内存转储到磁盘/DB中。它也非常适宜实时数据处理。
最初,Redis不是一对一和一对多。然而,自从Redis 5.0推出pub-sub以来,功能得到了提升,一对多成为了一种现实选择。
每个用例的代理我们先容了RabbitMQ、卡夫卡和Redis的一些特性。这三种动物都属于这一类,但如上所述,它们的运作办法截然不同。下面是我们根据不同的用例为精确的MessageBroker供应的建议。
短:RedisRedis的内存数据库险些完备适宜于不须要持久性的短用例。由于它供应了极快的做事和内存功能,Redis是短保留的完美选择,在短保留中,持久性并不主要,您可以容忍一些丢失。随着Redis streams在5.0中的发布,它也是一对多用例的候选者,这是由于限定和旧的发布订阅功能而绝对须要的。
大量数据:KafkaKafka是一个高吞吐量的分布式行列步队,用于永劫光存储大量数据。Kafka非常适宜于须要持久性的一对多用例。
繁芜路由:RabbitMQRabbitMQ是一个较老但成熟的代理,具有许多支持繁芜路由的特性和功能。当所需速率不高(超过数万msg/秒)时,它乃至支持繁芜的路由通信。
考虑你的软件栈
当然,末了要考虑的是您当前的软件堆栈。如果您正在探求一个相对大略的集成过程,并且不肯望在堆栈中掩护不同的代理,那么您可能更方向于利用堆栈已经支持的代理。
例如,如果您在RabbitMQ之上的系统中利用芹菜作为任务行列步队,您将有动力利用RabbitMQ或Redis,而不是Kafka,后者不受支持,须要一些重写。