2012-06-13 5 views
3

짧은 버전 : 원격 프로 시저 호출 상황에서 Pika를 차단하지 못하게하려면 어떻게합니까?오래 근무하는 소비자의 Pika와 동시성을 제공하려면 어떻게해야합니까?

긴 버전 다음 새앙 토끼의 예

없음 내 사용 사례를 보여줍니다.

AMQP (RabbitMQ, Pika)를 통해 다른 프로세스/기계와 통신하는 토네이도 서버가 있습니다. 이러한 다른 프로세스는 잘 정의되어 있지 않지만 대부분 데이터를 반환합니다 (RPC example on RabbitMQ's website 참조). 때로는 많은 양의 정보를 처리하는 데 오랜 시간이 걸릴 수도 있지만 작은 요청이 처리되는 것을 완전히 차단해서는 안됩니다. 또는 원격 요청이 웹 요청을 발송했기 때문에 원격 서버가 차단되었을 수도 있습니다. 웹 서버와 비슷하지만 HTTP 대신 AMQP를 사용하십시오.

Pika 문서에서는 스레드로부터 안전하지 않다고 주장하므로 연결을 여러 스레드 (또는 프로세스)에 전달할 수 없습니다. 내가하고 싶은 일은 새로운 프로세스를 시작하고 Pornoopop에 소켓 이벤트를 추가하는 것입니다. Tornado와 함께 할 수 있습니다. Pika IOLoop은 Tornado IOLoop과 많이 다르며 여러 핸들러를 추가하는 것을 지원하지 않습니다. 하나의 소켓에서 하나의 "폴러"를 사용하여 작동하는 것으로 보입니다.

IOLoop 만 사용하기 때문에이 패키지에 토네이도 패키지가 필요하지 않도록하고 싶습니다. 그것은 의문의 여지가 아니지만, 내 다른 옵션이 무엇인지, 또는 어떻게 든 여러 Pika IOLoops/폴러를 연결하여 내 문제에 대한 해결책이 있는지 알고 싶습니다. RabbitMQ의 문서에 따르면 근로자는 더 많은 것을 추가함으로써 종종 "확장"될 수 있다고합니다. 내가 들어오는 모든 요청에 ​​대한 연결을 만드는 것을 피하고 싶다.

답변

0

당신이 설명한대로 불행히도 다른 통신 모델이 필요하거나 여러 개의 Pika IOLoops/Pollers/Redundant Connections가 필요합니다.

문서 및 다른 사이트에서 RPC는 Pika가 항상 차단 문이며 스레드간에 전달 될 수없는 것처럼 들립니다. 저자가 실제로 Ioloop을 호출하면 Pika의 RPC가 본질적으로 차단되고 있다고 지적한 http://www.rabbitmq.com/tutorials/tutorial-six-python.html을 참조하십시오.

"When in doubt avoid RPC. If you can, you should use an asynchronous pipeline - instead of RPC-like blocking" 

완료되기 전에 동일한 연결에서 여러 RPC 호출을 계속 보내려면 다른 비동기 모델이 필요합니다. 완료되기 전에 동일한 연결에서 다중 RPC 호출이 기술적으로 금지되어 있지는 않지만 RPC 모델의 일반적인 구현은 아닙니다 (http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.progcomm%2Fdoc%2Fprogcomc%2Frpc_mod.htm). 필자는 Pika가이 모델과 함께 작동한다고 생각하지 않습니다. 콜백을 통해 비동기식 지원을 제공합니다 (내가 생각하는 제품이 아닌).

즉석에서 새로운 연결을 쉽게 생성하려면 연결에서 스레드 또는 프로세스 래퍼를 사용할 수 있습니다. 여기서 다른 컨텍스트에서 RPC를 만들고 차단하며 공통 대기열로 이동합니다. 주 스레드가 모니터 할 수 있습니다. 토네이도는 이것을 줄 수도 있지만 과도한 공격이라고 생각합니다. 그리고 100 줄 미만의 파이썬에서 다른 I/O 작업과 비슷한 작업을 수행 했으므로 그러한 연결 래퍼를 만드는 것은 어렵지 않습니다. 스레드 래퍼 버전에 대한 대기열 패키지 참조). 나는 당신이 이미 여러 IOLoops에 대한 이야기를 토대로이 가능성을 보았다고 생각합니다.

관련 문제