我一直在使用 AMQP 的 RabbitMQ 客户端,我注意到,ack两者reject都只接受交付标签。ack如果您使用reject相同的交货标签会发生什么?RabbitMQ 不会出错,但我想知道这是否会抛出一个错误,表明传递标签已被“声明”。
AMQP 规范对此有什么规定吗?
我正在设计一个 REST API,它根据此处详细介绍的异步设计工作。我正在使用 RabbitMQ 对初始请求进行排队 - 因此客户端发出调用,接收响应202 Accepted,并且作业由服务器排队。为了使客户端可以获得任务的状态更新(“完成百分比”),我们有一个辅助队列资源,就像链接的文章中一样。
鉴于每个任务都有自己的队列资源,似乎每个任务都需要一个临时 RabbitMQ 队列。我想知道这是否是一个明智的设计选择,尽管我看不到任何其他选择。这似乎不太高效,而且我对像这样创建大量临时队列的可能性感到不安,特别是因为我看不到一种方法来保证它们全部被清理(尽管 RabbitMQ 具有自动删除功能) 。在使用 RabbitMQ 之前,我使用 SQS 来实现此目的,并且对这方面可能发生的情况有痛苦的经验。
我注意到,对于那些使用 RPC 风格的 RabbitMQ 的人来说,类似类型的队列管理已经很熟悉了。然而,还有可能的替代方案吗?
我的应用程序有多个线程将消息发布到单个 RabbitMQ 集群。
阅读兔子文档:我阅读了以下内容:
对于使用多个线程/进程进行处理的应用程序,为每个线程/进程打开一个新通道而不是在它们之间共享通道是很常见的。
我明白,与其打开多个连接(昂贵),
不如打开多个通道。
但为什么不对所有线程使用单个通道呢?
与单个渠道相比,使用多个渠道有哪些好处?
我已经实现了 RabbitMQ,但卡在一个地方,似乎我的发送者无法向队列发送任何数据。
我的制作人课程:
@Service
public class MessageSender {
@Autowired
private AmqpTemplate template;
public void send(String text) {
template.convertAndSend(text);
}
}
Run Code Online (Sandbox Code Playgroud)
我的 spring 配置文件如下所示:
<rabbit:connection-factory id="connectionFactory"
addresses="${connectionFactory.addresses}" channel-cache-size="${connectionFactory.channel-cache-size}"
virtual-host="${connectionFactory.vhost}" username="${connectionFactory.user}"
password="${connectionFactory.password}" />
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" queue="myQueue" exchange="myExchange" routing-key="dummyKey"/>
<rabbit:queue name="myQueue" />
<rabbit:direct-exchange name="myExchange">
<rabbit:bindings>
<rabbit:binding queue="myQueue" />
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="messageHandler" method="onMessage" queue-names="myQueue" />
</rabbit:listener-container>
<rabbit:admin connection-factory="connectionFactory" />
<bean id="messageHandler" class="com.tm.email.sender.spring.MessageHandler" />
Run Code Online (Sandbox Code Playgroud)
我无法找出问题所在。
下面提到的事情完美地运作。我可以轻松地将消息推送到队列,然后我的发送者类工作得很好。
public class Send {
private final static String QUEUE_NAME = "myQueue";
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 当我使用 Bunny 时,当我使用以下命令打开到包含 50,000 条消息的队列的连接时:
queue = channel.queue('test.queue', :durable => true)
queue.subscribe(:manual_ack => true) do ...
Run Code Online (Sandbox Code Playgroud)
RabbitMQ 立即将所有消息从 移动READY到UNACKED,从而不会在 中留下任何消息READY。
如果我尝试使用相同的代码启动另一个兔子,它现在没有任何可读取的内容READY。
我错过了一些明显的东西吗?
我有一个 ASP.NET 网站,其中包含许多长时间运行(5 分钟到 2 小时)的用户启动的任务。我希望每个用户都能够看到自己作业的进度,并且能够关闭浏览器并稍后返回。
当前的计划是在每个作业启动时将其存储在数据库中,并将消息发布到 RabbitMQ 队列,Windows 服务将接收该消息并开始处理该作业。
但是,我不确定将进度信息从服务传递回网络服务器的最佳方法?我看到两个选择:
我倾向于第二种选择,因为我真的不想通过定期轮询/写入进度信息来增加数据库的更多开销。然而,有很多关于使用 RabbitMQ(作为消费者)的警告- 因为我没有发送重要消息(如果进度消息没有被处理也没关系),我想知道这是否重要?这并不是说困难(著名的遗言)。
这个选项听起来合理吗?还有更好的选择吗?
architecture asp.net windows-services rabbitmq long-running-processes
我无法理解使用 Celery 的优势是什么。我知道你可以将 Celery 与 Redis、RabbitMQ 等一起使用,但为什么我不直接获取这些消息队列服务的客户端,而不是将 Celery 放在它前面呢?
每次在我的网站上发出请求时,有关该事件的一些数据都会记录到数据库(Yandex ClickHouse)中。如果批量插入至少 1000 条记录,ClickHouse 的工作速度会显着加快。对于每个请求,我都想将数据发送到另一台计算机,该计算机将存储数据,然后当缓冲区达到一定大小(例如 1000)时将其刷新到数据库。我正在考虑使用 RabbitMQ 进行消息传递/缓冲,但我我不确定这是不是正确的工具。有什么建议么?
概述:
我正在尝试将 celery 作为守护进程运行来执行发送电子邮件的任务。它在开发中运行良好,但在生产中却运行不佳。我现在有了我的网站,每个功能都工作正常(没有 django 错误),但由于守护进程未正确设置,任务无法完成,并且我在 ubuntu 16.04 中收到此错误:
project_celery FATAL can't find command '/home/my_user/myvenv/bin/celery'
安装的程序/硬件,以及我到目前为止所做的事情:
我在 VPS 上使用 Django 2.0.5、python 3.5、ubuntu 16.04、rabbitmq 和 celery。我使用 venv 来完成这一切。我也安装了主管,当我检查时它正在运行sudo service --status-all,因为它旁边有一个+。Erlang 也已安装,当我检查时top,rabbitmq 正在运行。使用sudo service rabbitmq-server status表明rabbitmq也处于活动状态。
最初,我按照celery 网站上的说明进行操作,但它们非常令人困惑,并且在测试/阅读/观看其他人的解决方案约 40 小时后我无法让它工作。感到非常恼怒和挫败,我选择了这里的方向来设置守护进程并希望我能到达某个地方,并且我已经走得更远,但我收到了上面的错误。
我通读了主管文档,检查了进程状态以尝试调试问题以及程序设置,但我迷失了,因为根据文档,据我所知,我的路径是正确的。
这是我的文件结构:
home/
my_user/ # is a superuser
portfolio-project/
project/
__init__.py
celery.py
settings.py # this file is in here too
app_1/
app_2/
...
...
logs/
celery.log
myvenv/
bin/
celery …Run Code Online (Sandbox Code Playgroud) 我对 RabbitMQ 还很陌生,我正在开发一个 POC 来运行在 docker 容器中使用 RabbitMQ 的 C# 解决方案。
我设法编写了 docker-compose.yml、dockerfile 并运行了 RabbitMQ。但是,我的解决方案无法访问 RabbitMQ 主机。我想我可能缺少一些配置,但我不知道是什么。
docker-compose.yml
version: '3.4'
services:
rabbit-sender:
image: rabbit-sender
container_name: rabbit-sender
build:
context: ../SenderRabitMQ
dockerfile: debug.Dockerfile
env_file: common.env
networks:
- rabbitPoc
expose:
- "80"
rabbit-receiver:
image: rabbit-receiver
container_name: rabbit-receiver
build:
context: ../ReceiveRabitMQ
dockerfile: debug.Dockerfile
env_file: common.env
networks:
- rabbitPoc
expose:
- "80"
rabbitmq:
image: rabbitmq:3.7.15
hostname: rabbitmq
build:
context: rabbit
dockerfile: debug.Dockerfile
ports:
- "5672:5672"
- "15672:15672"
volumes:
- "./enabled_plugins:/etc/rabbitmq/enabled_plugins"
Run Code Online (Sandbox Code Playgroud)
调试.Dockerfile
Install RabbitMQ
FROM ubuntu:14.04.1 …Run Code Online (Sandbox Code Playgroud) rabbitmq ×10
celery ×2
amqp ×1
architecture ×1
asp.net ×1
asynchronous ×1
bunny ×1
c# ×1
channel ×1
clickhouse ×1
django ×1
docker ×1
dockerfile ×1
java ×1
logging ×1
messaging ×1
python ×1
rest ×1
ruby ×1
spring-amqp ×1
supervisord ×1
ubuntu ×1