我正在开发一个多人游戏,它需要一个消息队列(即消息输入,消息输出,没有重复或删除的消息,假设没有意外的高速缓存驱逐)。以下是我所知道的基于memcache的队列:
我从this blog post了解了memcache队列的概念:
所有消息都以整数作为键保存。有一个密钥具有下一个密钥,另一个密钥具有队列中最旧的消息的密钥。要访问这些,增量/减量方法用作其原子,因此有两个键充当锁。它们会递增,如果返回值为1,则进程具有锁定,否则它将继续递增。一旦完成该过程,它将值设置回0.简单但有效。需要注意的是整数会溢出,因此有一些逻辑可以在我们接近该限制时将使用过的键设置为1。由于增量操作是原子的,只有在使用两个或多个内存缓存(用于冗余)时才需要锁定,以保持这些内存同步。
我的问题是,是否有可以在App Engine上运行的基于memcache的消息队列服务?
答案 0 :(得分:9)
我会非常小心地以这种方式使用Google App Engine Memcache。你担心“意外的缓存驱逐”是正确的。
Google希望您将内存缓存用于缓存数据,而不是存储数据。他们不保证将数据保留在缓存中。来自GAE Documentation:
默认情况下,项目永不过期 物品可能因记忆而被驱逐 压力。
修改:总是Amazon's Simple Queueing Service。但是,这可能不符合价格/性能水平:
答案 1 :(得分:4)
我已经启动了一个Simple Python Memcached Queue,它可能很有用: http://bitbucket.org/epoz/python-memcache-queue/
答案 2 :(得分:1)
如果您对丢失数据的可能性感到满意,请务必继续。但请记住,尽管memcache通常具有比数据存储更低的延迟,但与其他任何东西一样,如果您想要在单个元素上执行高速率的原子操作,它将会受到影响。这不是数据存储问题 - 它只是一个必须序列化访问的问题。
如果做不到这一点,亚马逊的SQS似乎是一个可行的选择。
答案 3 :(得分:1)
为什么不使用任务队列:
https://developers.google.com/appengine/docs/python/taskqueue/
https://developers.google.com/appengine/docs/java/taskqueue/
似乎解决了这个问题,而没有基于Memcached的队列中可能丢失的消息。
答案 4 :(得分:0)
在Google推出正确的作业队列之前,为什么不使用数据存储?正如其他人所说,memcache只是一个缓存,可能会丢失队列项(这将是......坏)
数据存储应该比你需要的还要快 - 你只需要一个简单的工作模型,它比memcache更灵活,因为你不仅限于键/值对