【问题标题】:What's the best way to implement message queue on medium traffic website在中等流量网站上实现消息队列的最佳方法是什么
【发布时间】:2012-03-04 22:42:09
【问题描述】:

首先,关于我的项目的一些基本信息:我有一个每天有大约 1000 名访问者的网站,使用 Symfony 2 构建。对于一些我正在考虑实现消息队列的任务,基于 Rabbit MQ 将是我的首选在一些互联网评论上。

但我认为我将有很多不同的任务类型(在第一阶段大约有 10 个任务),而且它们不会运行那么多。例如:我想要一个用于发送电子邮件的消息队列:我希望这些立即发送,因此创建一个 cron 作业是不可接受的,但我的网站可能每天发送 5 封电子邮件。

现在我想知道为每种任务类型创建消息队列是否更好。在这种情况下,我将不得不运行 10 个并发消费者。或者创建一个“通用”队列,它只使用消息中的参数执行 Symfony2 命令。

我认为最好和最“纯粹”的解决方案是第一个(10 个队列),但我担心它有点“过度”......

那么有没有人有这方面的经验愿意帮助我?

【问题讨论】:

    标签: php symfony message-queue rabbitmq


    【解决方案1】:

    我建议为您需要执行的每个独特任务创建不同的队列,并为队列分配优先级,以便最重要的操作首先执行,即使它们稍后与队列中的其他消息一起添加。

    在您的队列处理器中,您可以使用消息正文作为参数来执行不同的命令。

    【讨论】:

    • 是的,我真的认为这是实现它的“最佳”方式,但我有点担心我必须实例化 10 个消费者(对于每个队列),并跟踪它他们都在跑。这使得部署有点困难(虽然应该不是真正的原因),而且因为大多数队列每天收到的消息可能少于 10 条,我想知道这是否是最好的方法......也许我偷偷地希望有人有一个更好的解决方案,我从来没有遇到过 ;-)
    • 您可以一次处理一条队列消息,一旦完成,您就可以移动到下一条消息。您还设置了一个锁,以确保在任何时候只有一个队列处理操作在进行,并且如果它终止,则重新启动处理的作业。我已经使用这样的模型处理了大约 500,000 条用于初始应用程序加载的消息
    • 如果我理解正确:只需创建一个任务(Symfony CLI 进程),它会循环队列并相应地处理它们?那为什么需要锁呢? RabbitMQ 不提供这个吗?但我喜欢这个主意 :-) 谢谢 :D
    • 我对 RabbitMQ 不是很熟悉,但是你可以创建一个 CLI 任务,从队列中读取消息并处理它们,然后在处理成功完成后从 RabbitMQ 中删除消息。您甚至可以根据消息来自哪个队列执行不同的命令。消息的 CLI 脚本处理需要锁定,以确保一次只运行一个实例。当处理失败时,锁定文件仍然存在,因此您可以在指定时间段后将其删除(使其足够大以确保处理已安全完成)
    • 非常感谢,本周我将在某个地方测试/实现它;-)
    【解决方案2】:

    我也有同样的情况。我对构建类似的东西很感兴趣。

    不幸的是,我仍在尝试设置该项目。到目前为止,我已经度过了一天,现在我可以发送和接收消息了。我需要继续弄清楚文档所指的“服务”定义中的相关性和相关性。

    当我有答案时,我会明确地添加我的答案。

    到目前为止,我做了什么:

    1. 下载 Symfony 2
    2. 添加了以下子模块

      git submodule add git://github.com/videlalvaro/RabbitMqBundle.git vendor/bundles/OldSound/RabbitMqBundle
      git submodule add git://github.com/videlalvaro/php-amqplib.git endor/videlalvaro/php-amqplib
      
    3. 遵循RabbitMqBundle 上的说明。

    ...我有一些工作,但还没有弄清楚什么是按照哪些约定工作的。

    【讨论】:

    • 我已经考虑过 RabbitMqBundle 来解决这个问题,但我的问题是我应该创建一个“通用”队列(每个任务执行一个 Symfony 任务),或者为每个任务创建一个单独的队列任务...
    • 顺便说一句,这里有同样的问题。我正在考虑创建一个 Bundle 来监听通过创建消费者类接收到的事件。我正在积极阅读它。如果您愿意,我们可以在某个地方设置一个 Wiki 页面来分享我们的笔记;)
    • @renoirb 有没有搞定那个 Wiki?希望实现这样的东西
    • 嗨。不,我还没有这样做。不过,我现在要实施它。当我开始这个线程时,我正在开始我的项目并且不需要它,现在我会的。我会及时通知你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2010-11-11
    • 2015-08-21
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多