ZeroMQ modèles persistance
-
27-09-2019 - |
Question
Qui doit gérer la persistance dans le ZeroMQ?
Lorsque nous utilisons les clients ZeroMQ en langage Python, quels sont les plug-ins / modules disponibles pour gérer la persistance?
Je voudrais connaître les motifs d'utiliser le ZeroMQ.
La solution
Pour autant que je sache, ZeroMQ n'a pas de persistance. Il est hors de portée pour elle et doit être manipulé par l'utilisateur final. Tout comme sérialisation le message. En C #, je l'ai utilisé db4o d'ajouter la persistance. En général, je persiste l'objet à l'état brut, sérialisation alors et l'envoyer à la prise ZMQ. BTW, ce fut pour la paire PUB / SUB.
Autres conseils
Sur les extrémités de l'application, vous pouvez persister en conséquence, par exemple, je l'ai construit une couche de persistence dans Node.js qui communiquait aux appels php back-end et via websockets.
L'aspect persistence tenu des messages pendant une certaine période de temps (http://en.wikipedia.org/wiki/Time_to_live) c'était de donner aux clients la possibilité de se connecter. Je en mémoire des structures de données, mais je caressais l'idée d'utiliser Redis pour gagner persistence sur disque.
Nous avions besoin pour conserver les messages reçus d'un abonné avant de les traiter. Les messages sont reçus dans un fil séparé et stocké sur le disque, tandis que la file d'attente de message persistant est manipulé dans le fil principal.
Le module est disponible à l'adresse: https://pypi.org/project/persizmq . De la documentation:
import pathlib
import zmq
import persizmq
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.setsockopt_string(zmq.SUBSCRIBE, "")
subscriber.connect("ipc:///some-queue.zeromq")
persistent_dir = pathlib.Path("/some/dir")
storage = persizmq.PersistentStorage(persistent_dir=persistent_dir)
def on_exception(exception: Exception)->None:
print("an exception in the listening thread: {}".format(exception))
with persizmq.ThreadedSubscriber(
callback=storage.add_message, subscriber=subscriber,
on_exception=on_exception):
msg = storage.front() # non-blocking
if msg is not None:
print("Received a persistent message: {}".format(msg))
storage.pop_front()