मैंने देखा है कि एक zeromq PUB सॉकेट उदाहरण के लिए बाहर जाने वाले सभी डेटा बफ़र्स अगर यह जोड़ता है, बफ़र्सZeroMQ PUB सॉकेट मेरे सभी बाहर जा रहा डेटा जब यह कनेक्ट हो रहा है
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.connect("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.bind("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print sub.recv()
उप उन संदेशों के बाद बांधता है, वे गिरा दिया जाना चाहिए, क्योंकि यदि कोई इससे जुड़ा नहीं है तो PUB को संदेश छोड़ना चाहिए। लेकिन संदेशों को छोड़ने के बजाय, यह सभी संदेशों को बफर करता है।
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
hi
आप देख सकते हैं, उन "संदेश गिरा नहीं किया जाना चाहिए" सॉकेट से बफ़र कर रहे हैं, एक बार यह जुड़ा हुआ हो जाता है, यह उन्हें उप सॉकेट से फ्लश। अगर मैं पब सॉकेट पर बांधता हूं, और एसयूबी सॉकेट से कनेक्ट करता हूं, तो यह सही तरीके से काम करता है।
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.bind("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.connect("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print repr(sub.recv())
और आप केवल उत्पादन
'hi'
अजीब व्यवहार इस तरह की एक समस्या का कारण देख सकते हैं, यह एक जोड़ने सॉकेट पर सभी डेटा बफ़र्स, मैं दो सर्वर है, सर्वर एक डेटा सर्वर से प्रकाशित करता है बी
Server A -- publish --> Server B
सर्वर बी ऑनलाइन होने पर यह ठीक काम करता है। लेकिन अगर मैं सर्वर ए शुरू करता हूं और सर्वर बी शुरू नहीं करता हूं तो क्या होगा?
परिणामस्वरूप, सर्वर ए पर कनेक्टिंग पब सॉकेट उन सभी डेटा को रखता है, स्मृति उपयोग उच्च और उच्च हो जाता है।
यहां समस्या है, क्या इस तरह का व्यवहार एक बग या फीचर है? यदि यह सुविधा है, तो मुझे यह दस्तावेज़ कहां मिल सकता है जो इस व्यवहार का उल्लेख करता है? और मैं कनेक्टिंग पब सॉकेट बफर को सभी डेटा कैसे रोक सकता हूं?
धन्यवाद।
मुझे पता है कि मैं बफर में संदेश संख्या को सीमित करने के लिए एचडब्लूएम सेट कर सकता हूं। लेकिन यह समस्या का समाधान नहीं करता है, वे जिस तरह से PUB हैंडल करता है एचडब्लूएम राज्य नए संदेशों को छोड़ना है। इसका मतलब है कि यदि आप एचडब्लूएम सेट करते हैं, तो केवल प्रमुख संदेश बफर में रखे जाते हैं। मैं जो लिख रहा हूं वह ऑडियो स्ट्रीमिंग सिस्टम है। इस प्रकार का व्यवहार इसे उपयोग करने में बहुत परेशान करता है। आइए मान लें, आप संदेश भेजते हैं [1, 2, 3, 4], और फिर एचडब्लूएम 2 पर सेट किया गया था, तो सॉकेट आपके लिए [1, 2] बफर करेगा, सभी नए संदेश गिराए जाएंगे। लेकिन ऑडियो स्ट्रीमिंग के लिए, सबसे महत्वपूर्ण हिस्सा नया आने वाला डेटा है। एचडब्लूएम संदेश कैसे छोड़ता है यह समायोजित करने का कोई तरीका है? –
आह, तो आपका मतलब है कि आप जिस व्यवहार को पसंद करेंगे वह यह है कि यदि एचडब्लूएम 2 पर सेट है और आप [1, 2, 3, 4] भेजते हैं तो उसे [1, 2] छोड़ना चाहिए और [3, 4] रखना चाहिए, लेकिन फिर यदि आपने 5 भेजा है तो उसे 3 छोड़ना चाहिए और आप [4, 5] के साथ खत्म हो जाना चाहिए? मुझे नहीं लगता कि व्यवहार ZMQ में मौजूद है। – aculich
यह बहुत दिलचस्प है। निश्चित रूप से कुछ पुराने अनुप्रयोगों के लिए "पुराने" संदेशों को छोड़ने की क्षमता आवश्यक होगी (आईपी टेलीफोनी एक आम उदाहरण के रूप में दिमाग में आता है)। –