2009-03-09 6 views
10

멀티 플레이어 게임을하고 있는데 메시지 대기열이 필요합니다 (예 : 메시지 수신, 메시지 출력, 중복 또는 삭제 된 메시지가 예기치 않은 캐시 퇴거가 없다고 가정).Memcache 기반 메시지 큐?

내가 개념을 배웠다 memcache 대기열의 위치 : this blog post :

모든 메시지는 정수와 함께 키로 저장됩니다. 다음 키가있는 키와 대기열에 가장 오래된 메시지의 키가있는 키가 있습니다. 이들에 액세스하려면 증분/감소 방법이 원자 단위로 사용되므로 잠금 역할을하는 두 개의 키가 있습니다. 그들은 증가하고 리턴 값이 1이면 프로세스는 잠금을 가지며, 그렇지 않으면 프로세스는 계속 증가합니다. 일단 프로세스가 끝나면 값을 다시 0으로 설정합니다. 간단하지만 효과적입니다. 한 가지주의 할 점은 정수가 오버플로 될 것이므로 한도에 가까워지면 사용 된 키를 1로 설정하는 논리가 있습니다. 증가 작업이 원자 단위이므로 잠금을 유지하려면 두 개 이상의 memcaches가 중복되는 경우에만 잠금이 필요합니다.

내 질문에, App Engine에서 실행할 수있는 memcache 기반 메시지 대기열 서비스가 있습니까?

답변

9

이런 식으로 Google App Engine Memcache를 사용할 때 매우주의해야합니다. 당신은 "예기치 않은 캐시 퇴거"에 대해 걱정할 권리가 있습니다.

Google은 캐싱 데이터와를 저장하지 않는 을 memcache에를 사용할 것으로 예상. 캐시에서 데이터를 유지한다고 보장하지는 않습니다. GAE Documentation에서 : 항목으로 인해 메모리 압력을 퇴거 할 수 있지만 기본적으로

항목은 만료되지 않습니다.

편집 : 항상 Amazon's Simple Queueing Service있다. 그러나 가격/성능 수준을 다음과 같이 충족하지 못할 수 있습니다.

  1. Google에서 Amazon 서버로 전화하는 데 대기 시간이 소요됩니다.
  2. 모든 데이터 트래픽에 대해 두 차례 지불하면 결국 Google을 떠나 Amazon에 들어가기 위해 비용을 지불하게됩니다.
+0

캐시의 항목 만료는 비활성 상태를 기반으로하므로 대기열 수명이 예상대로라면 좋을 것입니다. 그 성명에는 많은 수식어가 있지만 당신은 분명히 그 열에있는 잃어버린 물건을 다룰 필요가 있습니다. –

+0

또한 GAE와 함께 메시지 대기열을 사용해야하지만 GAE는 Java와 Python 만 지원하기 때문에 위에서 언급 한 memcache 기반 대기열 서비스 (MemcacheQ, 참새 등)를 GAE와 연결하는 방법에 대해서는 모르겠다. 그것에 대한 어떤 생각을 알고 싶습니다. 또한 AmazonSQS 이외에도 GAE에서 사용할 수있는 다른 메시지 대기열 서비스는 무엇입니까? –

0

Google에서 적절한 작업 대기열을 구현할 때까지 데이터 저장소를 사용하지 않는 이유는 무엇입니까? 다른 사람들이 말했듯이, memcache는 단지 캐시 일 뿐이며 대기열 항목을 잃을 수도 있습니다. (불량 일 것입니다)

데이터 저장소는 필요한만큼 빨리 처리해야합니다. 간단한 작업 모델 만 있으면됩니다. 키/값 쌍에 국한되지 않으므로 memcache보다 융통성이 있습니다.

+0

특히 최근의 성능 문제로 인해 비용 효과적이지는 않습니다. 사용량이 많은 경우이 대기열을 통해 하루에 100 만 개가 넘는 메시지를 보낼 것으로 예상됩니다. 데이터 저장소보다 Amazon 대기열 서비스를 사용하는 것이 더 저렴합니다. – gravitation

+0

아, 그만! – dbr

1

데이터를 잃을 가능성이 있다면 즉시 해결하십시오.하지만 memcache는 일반적으로 데이터 저장소보다 대기 시간이 짧지 만 단일 요소에서 높은 수준의 원자 연산을 수행하려는 경우 어려움을 겪을 수 있습니다. 이것은 데이터 스토어 문제가 아닙니다. 단순히 액세스를 직렬화해야하는 문제입니다.

아마존의 SQS가 실패 할 가능성이있는 것 같습니다.

나는 간단한 파이썬 Memcached가 큐를 시작
4

, 그것은 유용 할 수 있습니다 : http://bitbucket.org/epoz/python-memcache-queue/

+0

전에이 기술을 보았던 것을 기억하는 것 같지만, 이와 같이 패키징하려면 +1하십시오. – Joel

+0

여기에서 이와 같은 작업을하려고합니다. https://github.com/nmmmnu/SimpleMessageQueue 그러나 잠금을 사용하지 않으면 메시지가 손실 될 수 있습니다. 다른 쪽에서 잠금이 만료되지 않으면 전체 작동이 중단 될 수 있습니다. 잠금 만료를 수행하면 잠금을 해제 할 때 혼란이 발생할 수 있습니다. – Nick