消息队列使用哪些协议与客户端进行通信?

3

我曾经使用过消息队列,但从未考虑过它们用什么协议进行通信?基本上它们都支持阻塞方法,例如

// sleeps the thread until any message is available
Object message = queueService.take()

但我从来没有想过这个客户端-服务器(MOM)实现的方式是怎样的。
根据我所了解,RMI 已经基本上被淘汰了(而且不确定它是否支持阻塞方法),那么现代的消息队列使用什么来进行通信呢?
有没有关于实现自己的队列的书籍/教程/课程,或者能够详细描述这些内容的资料?
谢谢回答!

1
RMI是一个仅限于Java的类似CORBA的API。我相信Rabbit使用AMQP,它有Java/Kotlin、C#、JavaScript/Node、Python等客户端。Kafka有自己的协议:https://kafka.apache.org/protocol.html - duffymo
1个回答

2
一些使用专有协议,而其他一些使用诸如AMQPMQTT之类的几种标准。总之,通过精心设计,特定的客户端只能连接到特定的消息代理;不应该假设客户端可以自由混合和匹配。
协议的多样性部分是由于历史原因,各个供应商独立开发竞争性的面向消息的中间件产品。但是今天,仍然有充分的理由支持不同的协议。例如,MQTT轻量级且适用于嵌入式设备,而AMQP更适用于企业应用程序。

有趣,但是他们如何实现阻塞方法呢?在本地计算机上,线程通过调度程序/硬件锁被唤醒,但是如果例如take()方法阻塞了,他们如何唤醒线程呢?是否存在忙等待或者其他特定的技术?我想练习自己实现一个队列,可惜这些主题非常难找到,关于它们的信息几乎不存在。 - Johnyb
@BasilBourque 很有趣,基本上就是同步方法调用,等待服务器响应(带或不带超时),而不会将线程设置为等待状态。然而,我看到这些方法支持中断异常,这只是一种API包装器,以便在新线程中执行此同步方法以获得更好的使用效果吗? - Johnyb
@erickson 是的,但如果在线程级别上:客户端代码必须调用take()方法,在该方法中必须有某种代码来查找是否有要获取的元素,我想这是对服务器的调用,如果返回null,则take()方法在线程级别上调用wait()。但是服务器如何在客户端调用的wait()上调用notify()呢?由于整个线程处于等待状态,并且没有忙等待(或者说它是忙等待吗?)。我越来越困惑了 :) - Johnyb
@Johnyb 服务器不会调用notify()方法;在客户端中,一个正在从套接字读取的线程将在接收到完整的消息后调用它。 - erickson
@erickson 谢谢,你有什么推荐的资源可以阅读吗?比如书籍、课程、博客或者Udemy课程之类的,关于这些技术的实施方面。看起来像是基本的并发实践,但是很难找到相关的资源(我指的不仅仅是关于并发的内容,还包括来自微软等公司的实际示例)。 - Johnyb
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接