该RabbitMQ的Java客户端具有以下概念:
Connection
- 与RabbitMQ服务器实例的连接Channel
- ???我想了解的关系,更重要的是,该协会之间.
Channel
是什么,除了这是你发布和使用的结构,以及它是从一个开放的连接创建的.如果有人可以向我解释"频道"代表什么,那么可能有助于澄清一些事情.在此先感谢您的帮助!
我一般只是开始使用RabbitMQ和AMQP.
大多数RabbitMQ文档似乎都专注于循环,即单个消费者使用单个消息,负载在每个消费者之间传播.这确实是我见证的行为.
例如:生产者有一个队列,每2秒发送一次消息:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
var count = 1;
connection.on('ready', function () {
var sendMessage = function(connection, queue_name, payload) {
var encoded_payload = JSON.stringify(payload);
connection.publish(queue_name, encoded_payload);
}
setInterval( function() {
var test_message = 'TEST '+count
sendMessage(connection, "my_queue_name", test_message)
count += 1;
}, 2000)
})
Run Code Online (Sandbox Code Playgroud)
这是一个消费者:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
connection.on('ready', function () {
connection.queue("my_queue_name", function(queue){
queue.bind('#'); …
Run Code Online (Sandbox Code Playgroud) 我试图了解JMS以及它与AMQP术语的关联方式.我知道JMS是一个API,而AMQP是一个协议.
这是我的假设(以及问题)
上面的一些可能是愚蠢的.:-)但是试图绕过它.
而不是写自己的图书馆.
我们正在开发一个项目,这个项目将是一个自我划分的服务器池,如果一个部分变得太重,管理员会将其划分并将其作为一个单独的进程放在另一台机器上.它还会警告所有连接的客户端,这会影响连接到新服务器.
我很好奇使用ZeroMQ进行服务器间和进程间通信.我的伴侣宁愿自己动手.我期待社区回答这个问题.
我自己是一个相当新手的程序员,只是学习了消息队列.正如我用Google搜索和阅读,似乎每个人都在使用消息队列来处理各种各样的事情,但为什么呢?是什么让他们比编写自己的图书馆更好?为什么它们如此常见,为什么会有这么多?
我是RabbitMQ的新手.
我已经建立了一个'主题'交换.消费者可以在发布者之后开始.我希望消费者能够接收在他们启动之前已经发送的消息,而这些消息还没有被消费.
交换使用以下参数设置:
exchange_type => 'topic'
durable => 1
auto_delete => 0
passive => 0
Run Code Online (Sandbox Code Playgroud)
使用此参数发布消息:
delivery_mode => 2
Run Code Online (Sandbox Code Playgroud)
消费者使用get()从交换中检索消息.
不幸的是,任何客户端启动之前发布的任何消息都将丢失.我使用了不同的组合.
我想我的问题是交换机没有保留消息.也许我需要在发布者和队列之间有一个队列.但这似乎不适用于通过密钥路由消息的"主题"交换.
知道我该怎么做.我使用Perl绑定Net :: RabbitMQ(应该无关紧要)和RabbitMQ 2.2.0.
MOM(面向消息的中间件)解决了什么问题?可扩展性?积分?
他们通常使用哪个域,哪些域通常不使用?
例如,谷歌是否使用此类解决方案作为其主要搜索引擎或为GMail提供支持?
那么大型网站如沃尔玛,eBay,FedEx(几乎是一家Java商店)和buy.com(几乎是MS商店)呢?妈妈是否解决了那里的需求?
当你编写一个控制服务器端的Web应用程序并且拥有一个同质环境(比如数十个所有运行Linux + Java JVM的Amazon EC2实例)以及客户端(Web浏览器)时,它是否有意义?
对于需要与服务器通信的桌面应用程序是否有意义?
或者,对于大型企业而言,它通常是由无数不同系统组成的快乐组合,需要以某种方式进行通信?
我对它们有用的东西感到有点困惑,我认为通过它们适合的地方以及它们不合适的地方,我可以更好地理解它们的用途.
我正在进行实时的实时Web应用程序开发.
浏览器用户应该能够通过node.js服务器相互通信.其中一个用户写入消息,所有其他用户将获得它.
我不太了解RabbitMQ的工作原理.但是从快速阅读来看,它似乎处理消息的发布/订阅.
用户(在浏览器中)发布内容,订阅者(在其他浏览器中)获取该消息.这不是Socket.io用websockets做的吗?
这是我的问题:
我知道有两种选择:
但这究竟意味着什么呢?
"非持久性"如下:如果没有消费者,AMQP结构将尝试传递消息,消息将被删除?
"持久"如下:AMQP将重试消息,直到消费者接受它?
我们正在考虑为我们的微服务基础设施(编排)引入基于AMQP的方法.我们提供多种服务,比如客户服务,用户服务,文章服务等.我们计划将RabbitMQ作为我们的中央消息系统.
我正在寻找有关主题/队列等系统设计的最佳实践.一种选择是为我们系统中可能发生的每个事件创建一个消息队列,例如:
user-service.user.deleted
user-service.user.updated
user-service.user.created
...
Run Code Online (Sandbox Code Playgroud)
我认为创建数百个消息队列不是正确的方法,不是吗?
我想使用Spring和这些不错的注释,例如:
@RabbitListener(queues="user-service.user.deleted")
public void handleEvent(UserDeletedEvent event){...
Run Code Online (Sandbox Code Playgroud)
将"用户服务通知"作为一个队列,然后将所有通知发送到该队列是不是更好?我仍然想将听众只注册到所有事件的子集,那么如何解决呢?
我的第二个问题:如果我想要侦听之前未创建的队列,我将在RabbitMQ中获得异常.我知道我可以使用AmqpAdmin"声明"一个队列,但是我是否应该为每个微服务中的数百个队列执行此操作,因为到目前为止总是会发生队列创建?