相关疑难解决方法(0)

为什么我们需要使用rabbitmq

当我们在Python中使用一个名为Twisted的更强大的网络框架时,为什么我们需要RabbitMQ.我试图理解为什么有人想要使用RabbitMQ.

你能提供一个使用RabbitMQ的场景或例子吗?

另外,我在哪里可以找到有关如何使用RabbitMQ的教程?

python django twisted rabbitmq

53
推荐指数
5
解决办法
2万
查看次数

消息代理与数据库和监视

我的问题与这个问题有一些相似之处: 为什么像PostgreSQL这样的数据库需要像RabbitMQ这样的消息代理?

在我目前的(半专业)项目中,我也决定是否要使用数据库,基于消息代理(例如使用RabbitMQ),甚至是完全不同的解决方案.

让我们想象两个工具,工具A和工具B.每当工具A运行并完成时,工具B 可能有一些事情要做.工具A的执行需要安静一段时间(> 60秒)并且通常无需执行任何操作工具B.工具A为工具B提供了一些元数据,因此工具B知道该怎么做.

基于消息的解决方案:建立工具B正在使用的消息队列.如果执行工具A 并且工具B应该运行,则工具A将消息(包括元数据)发布到工具B接收的队列,以便工具B将使用消息中的元数据运行.

数据库解决方案:每当工具A运行时,它都会添加一个数据库记录,例如时间戳,元数据和状态"RUNNING".如果执行工具A 并且工具B应该运行,它会将DB记录状态更新为"NEXT_TOOL_B".工具B不断向DB查询"NEXT_TOOL_B"状态的记录.如果找到某些内容,工具B将使用DB记录中的元数据运行.

虽然我知道数据库解决方案的缺点,例如工具B的常量轮询,但我在基于消息的解决方案中遗漏了它的一个特性:

每当第三个工具(例如工具C,例如控制面板UI)想知道当前状态时,它也可以随时查询数据库,并且如果工具A仍在工作,它将发现"运行"状态.在消息解决方案中,我并没有真正看到"监视"状态的方法,除非完成消息将在队列中.

所以我的问题是,你能想到使用消息或任何其他方法实现这一点而不进行轮询吗?

database message-queue rabbitmq

3
推荐指数
1
解决办法
1530
查看次数

丢包更新是否可以在PostgreSQL中的读提交隔离级别中发生?

我在PostgreSQL中有如下查询:

UPDATE 
     queue 
SET 
  queue.status   = 'PROCESSING' 
WHERE 
    queue.status   = 'WAITING' AND
    queue.id       = (SELECT id FROM queue WHERE STATUS = 'WAITING' LIMIT 1 )
RETURNING 
        queue.id
Run Code Online (Sandbox Code Playgroud)

并且许多工人尝试一次处理一项工作(这就是为什么我有限制1的子查询).在此更新之后,每个工作人员都会获取有关id的信息并处理工作,但有时他们会抓取相同的工作并处理两次或更多次.隔离级别为Read Committed.

我的问题是如何保证一件作品要处理一次?我知道那里有很多帖子,但我可以说我已经尝试了大部分帖子但它没有帮助();

  • 我已经尝试了SELECT FOR UPDATE,但它导致了死锁的情况.
  • 我尝试过pg_try_advisory_xact_lock,但它是由共享内存引起
  • 我尝试添加AND pg_try_advisory_xact_lock(queue.id)外部查询的WHERE子句,但是...... [?]

任何帮助,将不胜感激.

postgresql concurrency worker-process

2
推荐指数
1
解决办法
758
查看次数