消息队列与消息传递

时间:2013-08-22 07:47:10

标签: message-queue message-passing

我看到here(关于IPC的维基百科文章)这些是两个不同的东西,但即使阅读每一个专用的维基百科页面,我都不明白它们之间的区别。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

消息传递是一个非常通用的术语。可以从不同方面对其进行检查,其中之一是数据如何从发送方传输到接收方:

  • 同步消息传递:发送方和接收方必须“满足”#34;在各自的send / receive操作中,以便可以传输数据。这也被称为“会合”'或者'握手'。这种转移形式很简单,但可能效率低下,因为发件人可能必须等待,即使它已经完成了职责并准备好要发送的数据。

  • 异步消息传递:发送方不等待接收方到达其receive操作,而是取消准备好的数据并继续执行。这种转移形式不会强制发件人等待,但会产生另一个问题:可能存在已发送但尚未收到的消息,并且必须将其存储在某处。这是消息队列发挥作用的地方,它们是传输中消息的缓冲区。

所以,你的问题的答案是,当消息传递是异步完成而不是同步完成时,使用/需要消息队列。

答案 1 :(得分:-1)

正如我所看到的,Message Passing描述了一个协议,而一个消息队列是一个实现细节。

请考虑以下事项: 您的应用程序具有明确定义的方式,通过传递消息来交换数据。这意味着您已经实现了一个协议,该协议描述了可以发送哪些消息以及应用程序如何响应它。这就是我称之为消息传递的本质。

现在,您可能已经通过多种方式实现了这一点。

  • 您可能已经告诉您的应用程序接收消息,处理它并传回回复,在此期间完全忽略其他传入消息。
  • 您可能已经告诉您的应用程序每个线程使用一条消息并使用专用线程来监听传入消息

消息队列将是一个实现,它接收通过消息传递传递的协议消息并存储它们。这使得它们按照它们到达的顺序逐个可用于应用程序的内部。但还有更多内容。

  • 队列可以查询其他队列
  • 队列可能希望将某些消息转发到另一个队列
  • 多个客户端查询一个队列或将消息转发给多个客户端

所以消息传递只是一种说法:“我有这个指令或一大堆代码,我想传递给某人”。表示消息队列的程序是消息的接收者,可以向其应用其他逻辑。