微服务为什么使用RabbitMQ?

微服务为什么使用RabbitMQ?,rabbitmq,microservices,Rabbitmq,Microservices,我还没有找到一个现有的职位问这个,但道歉,如果我错过了它 我正试着了解微服务,并且已经看到了使用RabbitMQ的文章。我不明白为什么需要RabbitMQ。服务是否打算使用web api与外部世界通信,以及使用RabbitMQ彼此通信?在微服务体系结构中,微服务之间有两种通信方式: 同步-也就是说,每个服务直接调用另一个微服务,这导致服务之间存在依赖关系 异步—您有一个中央集线器(或消息队列),在这里您将所有请求放在微服务之间,相应的服务接收请求,处理它并将结果返回给调用者。这就是Rabbit

我还没有找到一个现有的职位问这个,但道歉,如果我错过了它


我正试着了解微服务,并且已经看到了使用RabbitMQ的文章。我不明白为什么需要RabbitMQ。服务是否打算使用web api与外部世界通信,以及使用RabbitMQ彼此通信?

在微服务体系结构中,微服务之间有两种通信方式:

  • 同步-也就是说,每个服务直接调用另一个微服务,这导致服务之间存在依赖关系
  • 异步—您有一个中央集线器(或消息队列),在这里您将所有请求放在微服务之间,相应的服务接收请求,处理它并将结果返回给调用者。这就是RabbitMQ(或任何其他消息队列——MSMQ和Apache Kafka是很好的替代品)的用途。在这种情况下,所有的微服务只知道集线器的存在

有一些关于使用微服务的非常好的文章

消息队列提供了一个异步通信协议-您可以选择从一个服务向另一个服务发送消息,而不必知道另一个服务是否能够立即处理它。消息可以等待,直到责任服务就绪。发布消息的服务不需要知道将处理该消息的服务的内部工作方式。这种处理消息的方法将生产者与消费者分离

消息队列将使应用程序中的进程相互分离和独立;这种处理消息的方法可以创建一个易于维护和扩展的系统

简单地说,两种明显的情况可以作为消息队列真正闪亮的例子:

  • 用于长时间运行的进程和后台作业
  • 作为微服务之间的中间人
  • 对于长时间运行的流程和后台作业:

    当请求花费大量时间时,合并消息队列是最理想的方案

    设想一个web服务每秒处理多个请求,并且在任何情况下都不会丢失一个请求。此外,请求是通过耗时的流程处理的,但系统不能陷入困境。一些现实例子可能包括:

    • 图像缩放
    • 发送大量电子邮件(如时事通讯)
    • 搜索引擎索引
    • 文件扫描
    • 视频编码
    • 发送通知
    • PDF处理
    • 计算
    微服务之间的中间人:

    对于应用程序内部和之间的通信和集成,即作为微服务之间的中间人,消息队列也很有用。设想一个系统,它需要通知系统的另一部分开始处理某项任务,或者同时有大量请求传入,如以下场景中所示:

    • 订单处理(下单、更新订单状态、发送订单、付款等)
    • 食品配送服务(下订单、准备订单、配送食品)
    • 需要处理多个请求的任何web服务
    这个故事解释了Parkster(数字停车服务)如何使用RabbitMQ将其系统分解为多个微服务

    遵循web应用程序允许用户将信息上载到web站点的场景。该网站将处理这些信息,生成PDF并通过电子邮件将其发送回用户。在本例中,处理信息、生成PDF和发送电子邮件需要几秒钟,这也是使用消息队列的原因之一

    这是一个关于CloudAMQP如何以及为什么在微服务之间使用消息队列和RabbitMQ的故事

    是关于在基于事件的微服务体系结构中使用RabbitMQ每月支持1亿用户的故事

    最后,我向Kontena介绍了他们为什么选择RabbitMQ作为其微服务架构:“因为我们需要一个稳定、可管理且高度可用的消息传递解决方案。”


    请注意,我为CloudAMQP(RabbitMQ的托管提供商)背后的公司工作。

    同样的问题可能是为什么微服务需要REST?微服务的概念在月球上并不是什么新鲜事。后台工程和异步请求处理使用了长时间的工作流分布,Microservice是独立jvm中的同一组件,与SOLID中的S(单一责任)匹配。它之所以成为微服务,是因为它是平衡的。这就是全部!特别是(!),它可以是Spring Cloud/REST base上的REST服务,该服务由Eureka注册,在Zuul和Ribbon上具有代理网关和负载平衡。但这不是整个微服务世界!顺便说一句,异步分布式处理是使用微服务的任务之一。很久以前,分离JVM中的服务(组件)通过任何消息传递进行集成,这种模式称为ESB。微服务与模式中的主题相同。由于SpringCloudREST的流行,它似乎是微服务的唯一方式。不!例如,Vertx支持基于消息的异步微服务体系结构。为什么不使用RabbitMQ作为消息通道?在这种情况下,可以通过构建RabbitMQ集群来提供负载平衡。例如:。所以,世界范围更广。

    如果您在.net平台上,请查看NServiceBus()以获取异步消息(并且可以将RabbitMQ作为传输运行),您会说同步模式会导致依赖性。如果你有一个中央集线器,它位于If microservice的外面,这不也意味着依赖性吗?@mko,是的。它甚至被称为“单点失败”,没有银