10

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

我从这篇博文中了解了 memcache 队列的概念:

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

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

4

5 回答 5

9

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

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

默认情况下,项目永远不会过期,尽管项目可能会由于内存压力而被驱逐。

编辑:总是有亚马逊的简单排队服务。但是,这可能不符合价格/性能水平,因为:

  1. 从谷歌到亚马逊服务器的调用会有延迟。
  2. 你最终会为所有的数据流量支付两倍的费用——支付它离开谷歌的费用,然后再次支付它进入亚马逊的费用。
于 2009-03-09T07:21:59.010 回答
4

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

于 2009-04-24T08:04:31.800 回答
1

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

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

于 2009-03-09T10:06:45.307 回答
1

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

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

于 2012-08-06T16:13:50.490 回答
0

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

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

于 2009-03-09T07:32:23.120 回答