У меня очень странный случай с библиотекой Python Kazoo. Что я делаю в своем коде ниже:
Как только я подключаюсь к Zookeeper с помощью библиотеки kazoo, я создаю эфемерный узел, а затем наблюдаю за каким-то другим узлом, а затем продолжаю запускать программу вечно в бесконечном цикле. Я также добавил прослушиватель в Zookeeper. который также будет следить за состоянием.
У меня все работает отлично, эфемерный узел работает, часы на моем znode тоже работают нормально...
Иногда я наблюдаю довольно странное поведение из-за разрывов или разрывов соединения. Как я упоминал выше, я добавил слушателя в zookeeper, который будет отслеживать состояние, а также у меня есть оператор печати. Я всегда вижу, что эти операторы печати распечатываются как Lost
, Suspended
, Connected
, я полагаю, из-за разрывов соединения и после этого мои эфемерные ноды умирают и мои часы на зноде тоже не работают.
Ниже мой код, который работает вечно -
#!/usr/bin/python
from kazoo.client import KazooClient
from kazoo.client import KazooState
from kazoo.protocol.states import EventType
def watch_host(event):
print event
def my_listener(state):
if state == KazooState.LOST:
# Register somewhere that the session was lost
print "Lost"
elif state == KazooState.SUSPENDED:
# Handle being disconnected from Zookeeper
print "Suspended"
else:
# Handle being connected/reconnected to Zookeeper
# what are we supposed to do here?
print "Being Connected/Reconnected"
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()
zk.add_listener(my_listener)
# start an ephemeral node
zk.create("/my/example/h0", b"some value", None, True)
# put a watch on my znode
children = zk.get_children("/my/example/test1", watch=watch_host)
while True:
time.sleep(5)
Есть ли способ преодолеть эту проблему? Я хочу, чтобы всякий раз, когда мое состояние Zookeeper менялось на Lost
, Suspended
или Connected
. Я хочу, чтобы мой эфемерный узел работал, создав его снова (если это правильный подход), и мои часы на znode также всегда будут работать.
Поскольку я буду запускать свою программу всегда, поэтому по какой-то причине, если состояние Zookeeper изменится из-за прерывания соединения, и оно снова автоматически подключится, мне нужно убедиться, что мой эфемерный узел также работает, и мои часы на znode также начинают работать автоматически..
В настоящее время мой эфемер умирает, и часы также не работают, если состояние меняется автоматически..
Любая идея, как преодолеть эту проблему?
Lost
-> «Приостановлено» кажется недействительным. Вы видите правильную последовательность переходовLost
->Suspended
->Connected
? - person twil   schedule 28.11.2013my_listener
, где, как вы знаете, вы были подключены или повторно подключены? Похоже, вы хотите создавать эфемерный узел каждый раз, когда вы подключаетесь/переподключаетесь, а не только при первоначальном подключении, но ваш код делает только последнее. - person matt b   schedule 22.01.2014