【问题标题】:Inter process(service) communication without message queue没有消息队列的进程间(服务)通信
【发布时间】:2018-01-19 11:22:51
【问题描述】:

我们想开发一个基于微服务架构的应用程序。 为了在各种服务之间进行异步通信,我们计划使用消息队列(如 RabbitMQ、ActiveMQ、JMS 等)。除了消息队列还有其他方法可以实现进程间通信吗?

谢谢。

【问题讨论】:

标签: rabbitmq jms activemq message-queue microservices


【解决方案1】:

您应该使用队列来处理不需要实时完成的任务。

将任务添加到队列中,当有房间时,处理器将从队列中获取任务并处理并从队列中移除。

示例:

  1. 假设您的应用程序处理图像,用户上传了这么多图像。上传队列中的任务以压缩图像。当处理器空闲时,它会压缩排队的图像。

  2. 当您想写入系统的某种日志时,将其交给队列,一个进程将从队列中获取日志并将其写入磁盘。所以主进程不会在 I/O 操作上浪费时间。

建议:

如果您想要实时响应,则不应使用队列。您需要不断地 ping 队列以读取传入的消息,这是不好的做法。并且不能保证队列会立即处理您的任务。

所以解决方案是:

  1. Redis 缓存 - 您可以将消息放入缓存中,其他进程将读取该消息。 Redis 是“内存中的数据结构”。它非常快速且易于使用。互联网上有太多的图书馆和好的资源,因为它是开源的。 Read more about Redis. 但是这里你还需要继续检查是否有某种消息可用,如果可用,则从中读取,处理并给出响应。但是从 Redis 中读取并不是很昂贵。有了redis,你就不用担心内存管理了,开源社区管理的很好。

  2. 使用套接字。套接字要快得多,你可以使这个轻量级(如果你愿意),因为它是基于事件的。一个进程将在端口上 ping,其他进程将侦听并给出响应。但是你需要管理内存。如果缓冲内存已满,则不能在此处放置更多消息。如果有这么多用户生成消息,您需要管理要回复的对象。

所以这取决于您的要求,例如您想经常阅读消息吗?您是要进行一对一通信还是多对一通信?

【讨论】:

  • 感谢 Ujjaval。安装了各种传感器,这些传感器将定期发送数据(也基于事件或某人的请求)。我们想要获取数据并处理并持久化并进行操作。为了解决这个问题,我们需要一个更可扩展、更高效且松耦合的解决方案。
  • 所以它是多对一的。您是否需要实时执行此程序?使用套接字,您可以实时处理(传感器将在套接字上发出请求,而另一端的进程将侦听、操作并完成请求),使用 redis,您可以将数据放入缓存中,并在需要时,从中获取数据并使用,因此获取将变得快速并及时存储到数据库中。这两件事都是可扩展的。我可以使用缓存来存储 FB 喜欢的内容以便更快地访问,我可以使用套接字来使进程异步,所以这取决于您的制作方式。
  • @Ujjaval Moradiya 您能否详细说明“您应该使用队列来处理不太重要的任务 (..)”这句话背后的原因。在我看来,队列比直接通信(如 REST 或基于套接字)更可靠。请记住,您还可以对某些产品进行 pub-sub,这样就无需频繁池化。
  • @LechMigdal 句子应该是-“您应该使用队列来处理不需要实时完成的任务”。我写了 2 个最适合使用队列的示例。使用队列,应该只有一个消费者,否则您需要跟踪正在进行的任务。所以在这种情况下,当一个任务需要时间时,不能保证即将到来的任务会实时交付,在这种情况下队列会表现得更好。对我来说,队列意味着您正在制作任务列表,并且在 FIFO 基础上,任务将被完成。
  • 抱歉打错了——“不能保证即将到来的任务会实时交付,在这种情况下你不应该使用队列”
猜你喜欢
  • 2011-08-27
  • 2014-01-17
  • 2011-05-23
  • 2013-11-01
  • 2020-06-11
  • 1970-01-01
  • 2014-08-12
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多