Redis、Kafka或RabbitMQ:选择哪个作为微服务消息代理? - otonomo

解道jdon 2021-05-04 17:27:04
redis rabbitMQ kafka 微服 选择


将异步通信用于微服务时,通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定,确保消息在系统内得到管理和监视,并且消息不会丢失。您可以选择一些消息代理,它们的规模和数据功能各不相同。这篇博客文章将比较三种最受欢迎​​的经纪人:RabbitMQKafkaRedis

但是首先,让我们了解微服务通信。

 

微服务通信:同步和异步

微服务之间有两种常见的通信方式:同步和异步。在同步通信中,调用方在发送下一条消息之前等待响应,并且它作为HTTP之上的REST协议运行。相反,在异步通信中,无需等待响应即可发送消息。这适用于分布式系统,通常需要消息代理来管理消息。

您选择的通信类型应考虑不同的参数,例如微服务的结构方式,适当的基础架构,延迟,规模,依赖关系以及通信目的。异步通信的建立可能会更加复杂,并且需要添加更多组件才能堆叠,但是将异步通信用于微服务的好处远大于缺点。

 

异步通讯的优势

首先,根据定义,异步通信是非阻塞的。它也支持比同步操作更好的缩放。第三,在微服务崩溃的情况下,异步通信机制提供了各种恢复技术,通常更擅长处理与崩溃有关的错误。另外,当使用代理而不是REST协议时,接收通信的服务实际上并不需要彼此了解。在旧的服务运行了很长时间之后,甚至可以引入新的服务,即更好的解耦服务。

最后,在选择异步操作时,您将增强将来创建集中发现,监视,负载平衡甚至策略执行器的能力。这将为您提供在代码和系统构建中具有灵活性,可伸缩性和更多功能的功能。

 

选择合适的消息代理

异步通信通常通过消息代理进行管理。也有其他方法,例如aysncio,但它们更加稀少和有限。

在选择代理执行异步操作时,应考虑以下几点:

  1. 代理规模–系统中每秒发送的消息数。
  2. 数据持久性–恢复消息的能力。
  3. 消费者能力–经纪人是否有能力管理一对一和/或一对多的消费者。

一对一

一对多

我们检查了那里最新和最出色的服务,以找出这三个类别中最强的提供商。

 

RabbitMQ(AMQP)

规模:根据配置和资源,这里的运行速度约为每秒50K msg。

持久性:支持持久性消息和瞬时消息。

一对一与一对多的消费者:两者都有。

RabbitMQ于2007年发布,是最早创建的常见消息代理之一。它是一个开放源代码,通过实现高级消息队列协议(AMQP)通过点对点和pub-sub方法传递消息。它旨在支持复杂的路由逻辑。

有一些托管服务可让您将其用作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

规模:每秒最多可以发送一百万条消息。

持久性:基本上不是,它是内存中的数据存储。

一对一与一对多的消费者:两者都有。

Redis与其他消息代理有点不同。Redis的核心是一个内存中的数据存储,可以用作高性能键值存储或消息代理。另一个区别是Redis没有持久性,而是将其内存转储到Disk / DB中。它还非常适合实时数据处理。

最初,Redis不是一对一和一对多的。但是,由于Redis 5.0引入了pub-sub,因此功能得到了增强,一对多成为真正的选择。

 

每个用例的消息代理

我们介绍了RabbitMQ,Kafka和Redis的一些特征。这三种动物都是它们的类别,但是如上所述,它们的运行方式大不相同。这是我们建议正确的消息代理根据不同用例使用的建议。

 

短命消息:Redis

Redis的内存数据库几乎适用于不需要持久性的消息短暂的用例。因为Redis提供了非常快速的服务和内存功能,所以它是短保留消息的理想选择,在这些消息中持久性不是很重要,您可以容忍一些丢失。随着5.0中Redis流的发布,它也成为了一对多用例的候选者,由于局限性和旧的pub-sub功能,绝对需要使用它。

 

大量数据:Kafka

Kafka是一个高吞吐量的分布式队列,用于长时间存储大量数据。对于需要持久性的一对多用例,Kafka是理想的选择。

 

复杂路由:RabbitMQ

RabbitMQ是一个较老但很成熟的代理,具有许多支持复杂路由的功能。当所需速率不高(超过数万msg / sec)时,它甚至将支持复杂的路由通信。

 

考虑您的软件堆栈

当然,最后要考虑的是您当前的软件堆栈。如果您正在寻找一个相对简单的集成过程,并且不想在堆栈中维护其他代理,那么您可能更倾向于使用已由堆栈支持的代理。

例如,如果您在RabbitMQ之上的系统中使用Celery for Task Queue,那么您会获得与RabbitMQ或Redis一起使用的动力,而不是不支持Kafka且需要进行一些重写的​​Kafka。

在Otonomo,我们通过平台的发展和壮大使用了以上所有内容,然后再进行一些使用!重要的是要记住,每种工具都有自己的优点和缺点,这与了解它们并为工作以及特定的时机,情况和要求选择合适的工具有关。

版权声明
本文为[解道jdon]所创,转载请带上原文链接,感谢
https://www.jdon.com/55161

  1. Compare node.js with spring boot- Ryan Gleason
  2. Obvious pitfalls of spring Webflux- Ł ukaszKy ć
  3. Spring founder uncle rod's real thoughts on yaml
  4. 码农飞升记-02-OracleJDK是什么?OracleJDK的版本怎么选择?
  5. What is manong feisheng-02-oracle JDK? How to choose the version of Oracle JDK?
  6. Spring tide surging Xinanjiang
  7. Linux内核软中断
  8. Linux kernel soft interrupt
  9. Linux内核软中断
  10. Linux kernel soft interrupt
  11. Java multithreading Foundation
  12. The construction of Maven private library nexus
  13. I / O stream in Java
  14. JDK 16:Java 16的新功能 - InfoWorld
  15. 在Java中本地进行线程间数据传输的三种方式和源码展示
  16. jdon导致cpu 99%最后tomcat死掉---banq给予回复
  17. 用领域事件模拟AOP注入
  18. JDK 16: new function of Java 16 - InfoWorld
  19. Cartoon: from JVM lock to redis distributed lock
  20. Spring 3.1 终于加入了Cache支持
  21. Prototype与JQuery对比
  22. Three ways of data transmission between threads in Java and source code display
  23. Jdon causes 99% of CPU and Tomcat dies -- banq replies
  24. docker 原理之 user namespace(下)
  25. Simulating AOP injection with domain events
  26. Spring 3.1 finally adds cache support
  27. Comparison between prototype and jquery
  28. User namespace of docker principle (2)
  29. The way to learn java IO stream and XML
  30. Why does a seemingly correct code cause the Dubbo thread pool to be full
  31. 0 基础 Java 自学之路(2021年最新版)
  32. 0 basic Java self study road (latest version in 2021)
  33. c#—基础拾遗(1) 面向对象
  34. C - basic information (1) object oriented
  35. 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB
  36. Technology sharing differences between SQL and NoSQL databases: MySQL (VS) mongodb
  37. PHP教程/面向对象-3~构造函数和析构函数
  38. Spring Cloud的Feign客户端入门
  39. 优化Spring Boot应用的Docker打包速度
  40. PHP tutorial / object oriented - 3 ~ constructor and destructor
  41. Introduction to feign client of spring cloud
  42. Optimizing docker packaging speed of spring boot application
  43. 尚硅谷宋红康Java基础教程2019版
  44. 尚硅谷宋红康Java基础教程2019版
  45. Song Hongkang Java foundation course 2019
  46. Song Hongkang Java foundation course 2019
  47. Redis 6 的多线程
  48. Multithreading of redis 6
  49. SpringCloud-微服务架构编码构建
  50. SpringCloud-微服务架构编码构建
  51. Linux作业控制
  52. Coding construction of springcloud microservice architecture
  53. Java中几个常用并发队列比较 | Baeldung
  54. 为什么Java后端在创业企业中并不流行? -reddit
  55. Coding construction of springcloud microservice architecture
  56. Linux job control
  57. Comparison of several common concurrent queues in Java
  58. Why is java backend not popular in start-ups- reddit
  59. docker 资源限制之 cgroup
  60. 大数据环境: hadoop和jdk部署