2013-08-26 25 views
5

Aynı veri yolunda birden fazla yayıncının ve çoklu abonenin bulunduğu bir pub/alt mimariyi yapmaya çalışıyorum. İnternette okuduğum şeye göre, sadece bir soket bind() 'i çağırmalı ve diğerleri (pub veya sub) connect()' i çağırmalıdır.ZeroMQ'da tek bir uç noktaya sahip birden fazla yayıncıyı nasıl yaparım?

Sorun, bu yaklaşımla, aslında yuvadaki bind() işlevini çağıran yayıncıların hiç ileti yayınlamadığını buluyorum. Connect() işlevini çağıran tüm yayıncılarım sessizce başarısız oluyor ve aslında herhangi bir iletiyi otobüse yayınlamıyor gibi görünüyor. Bu bir abone önemli bir sorun değil, otobüste tüm mesajlarına abone olan basit bir "sniffer" uygulaması yazdım ve yalnızca bind() adlı yayıncı gösteriliyor.

Yayımcı ile birden çok bağlama girişiminde bulunursam, sessizce veri çalmayı "beklenen" zmq davranışı ipc ile gerçekleşir ve kullanımdaki bir bağlantı hatası tcp ile atılır.

Bu davranışı ipc ve tcp uç noktaları ile doğruladım, ancak sonuçta tam sistem epgm kullanıyor olacak. Bu durumda, dinamik bir keşif olmadığından (ipuç, tcp veya epgm multicast olsun uç noktaları bilinmediğinden) bir komisyoncuya ihtiyaç duymayacağımı düşünüyorum.

Eksik olan bir şey var mı, belki de bir yuva ayarı, bu da bağlantı yayıncılarının verilerini göndermemesine neden olacak mı? İnternette gördüğüm literatüre göre, “doğru” bir şey yapıyorum ama hala işe yaramıyor. Aynı son nokta üzerinde birden yayıncıları işlemek için uygun yolu nedir ve:

ZmqPublisher::ZmqPublisher() 
: m_zmqContext(1), m_zmqSocket(m_zmqContext, ZMQ_PUB) 
{} 


void ZmqPublisher::bindEndpoint(std::string ep) 
{ 
    m_zmqSocket.bind(ep.c_str()); 
} 

void ZmqPublisher::connect(std::string ep) 
{ 
    m_zmqSocket.connect(ep.c_str()); 
} 

Yani sonuçta, sorum şu: Referans olarak

, benim yayıncı sınıf bitiş noktası kurmak için aşağıdaki yöntemleri vardır neden birden fazla yayıncının mesajlarını görmüyorum?

+0

Sorunuz açık değil; gözden geçirmeyi düşünün. – raffian

cevap

2

Olabilir veya geçerliyse de The 0MQ Guide aşağıdaki hafifçe esrarengiz sözler vardır olmayabilir:

ØMQ soketli Teorik olarak, bağlanır ve hangi uç bağlandığı hangi uç önemli değildir. Bununla birlikte, pratikte daha sonra geleceğim belgelenmemiş farklılıklar vardır. Şebeke tasarımınız bunu imkansız hale getirmediği sürece şimdilik PUB'u bağlayın ve SUB'ı bağlayın.

aslında olur "daha sonra gel" ben nereye henüz keşfedilmiş değil, ama ben o kadar pub/sub kullanmayın ve kılavuzda "Gelişmiş Pub-Sub Desenler" bölümünü okumadım güzel detay. Bununla birlikte, tek bir son noktadaki birden fazla yayıncının fikri, benim için bir XPUB/XSUB stil aracısına ihtiyaç duyduğunu düşündürmektedir; Dinamik keşif ile ilgili değil, tek temas noktası ve yönlendirme hakkında. Nihayetinde, komisyoncu tabanlı bir topolojinin uygulamanızı basitleştireceğini ve sorunları tanımlamayı kolaylaştıracağını düşünüyorum.