【问题标题】:Memcache-based message queue?基于 Memcache 的消息队列?
【发布时间】:2010-10-12 03:04:12
【问题描述】:

我正在开发一个多人游戏,它需要一个消息队列(即消息输入、消息输出、没有重复或删除的消息,假设没有意外的缓存驱逐)。以下是我知道的基于内存缓存的队列:

我从this blog post学到了memcache队列的概念:

所有消息都以整数作为键保存。有一个键具有下一个键,另一个键具有队列中最旧消息的键。要访问这些,增量/减量方法用作其原子,因此有两个键充当锁。它们递增,如果返回值为 1,则进程拥有锁,否则它继续递增。一旦过程完成,它会将值设置回 0。简单但有效。一个警告是整数会溢出,因此有一些逻辑可以在我们接近该限制时将使用的键设置为 1。由于增量操作是原子的,因此只有在使用两个或多个内存缓存(用于冗余)时才需要锁定,以保持它们同步。

我的问题是,是否有可以在 App Engine 上运行的基于 memcache 的消息队列服务?

【问题讨论】:

    标签: memcached message-queue


    【解决方案1】:

    为什么不使用任务队列:
    https://developers.google.com/appengine/docs/python/taskqueue/
    https://developers.google.com/appengine/docs/java/taskqueue/

    似乎解决了这个问题,而不会丢失基于 Memcached 的队列中的消息。

    【讨论】:

      【解决方案2】:

      我已经启动了一个简单的 Python Memcached 队列,它可能有用: http://bitbucket.org/epoz/python-memcache-queue/

      【讨论】:

      • 我好像记得以前见过这种技术,但是像这样的包装+1。
      • 我在这里尝试做这样的事情:github.com/nmmmnu/SimpleMessageQueue 但是,如果没有锁定,可能会丢失消息。另一方面,如果锁永不过期,整个操作可能会卡住。如果你确实锁过期,那么如果你释放锁,就会发生混乱。
      【解决方案3】:

      如果您对丢失数据的可能性感到满意,请务必继续。但请记住,尽管 memcache 通常比数据存储具有更低的延迟,但与其他任何东西一样,如果您想要在单个元素上执行高速率的原子操作,它就会受到影响。这不是数据存储问题 - 只是必须序列化访问的问题。

      如果做不到这一点,亚马逊的 SQS 似乎是一个可行的选择。

      【讨论】:

        【解决方案4】:

        我会非常小心地以这种方式使用 Google App Engine Memcache。您担心“意外的缓存驱逐”是对的。

        Google 希望您将 memcache 用于缓存数据,而不是存储它。他们不保证将数据保存在缓存中。来自GAE Documentation

        默认情况下,项目永不过期,不过 物品可能因记忆而被驱逐 压力。

        编辑:总是有Amazon's Simple Queueing Service。但是,这可能不符合价格/性能水平,因为:

        1. 从 Google 到 Amazon 服务器的调用会有延迟。
        2. 您最终会为所有数据流量支付两次费用 - 为离开 Google 支付费用,然后为进入 Amazon 再次支付费用。

        【讨论】:

        • 我希望缓存中的项目到期将基于不活动,因此如果队列生命周期如您所说,那么您可能会没事。尽管该语句中有很多限定符,因此您肯定需要处理队列中丢失的项目。
        • 我还需要在 GAE 中使用消息队列,但我不知道如何将上述基于 memcache 的队列服务(MemcacheQ、sparrow 等)与 GAE 连接,因为 GAE 仅支持Java和Python,所以我想知道关于它的任何想法。除了 AmazonSQS 之外,我们还可以在 GAE 中使用哪些其他消息队列服务?
        【解决方案5】:

        在 Google 实施适当的作业队列之前,为什么不使用数据存储?正如其他人所说,memcache 只是一个缓存,可能会丢失队列项(这将是..糟糕)

        数据存储的速度应该足以满足您的需求 - 您只需一个简单的 Job 模型,它比 memcache 更灵活,因为您不限于键/值对

        【讨论】:

        • 尤其是最近出现的性能问题,它不会具有成本效益。在大量使用的情况下,我希望每天通过此队列发送超过 100 万条消息。使用 Amazon 队列服务会比使用数据存储更便宜。
        猜你喜欢
        • 2020-12-16
        • 2019-11-04
        • 1970-01-01
        • 2011-03-07
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 2012-09-22
        相关资源
        最近更新 更多