DBus vs ZeroMQ

Cerco un message system. Quello che vorrei è poter sottoscrivere un servizio e ricevere i messaggi, oppure semplicemente chiedere ad un processo con diritti maggiori alcune informazioni o di compiere azioni, senza dover aprire una porta tcp e gestire tutto a mano.

Devo fare delle azioni sull'hardware e penso che forse DBus già ha qualcosa fatto.

Cosa trovo:

 

dbus-send --session           \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

e

dbus-send --system            \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

rif.: http://unix.stackexchange.com/questions/46301/a-list-of-available-dbus-services

mi da l'idea di cosa sia dbus, un sistema che permette di registrare un servizio, di sottoscrivere un servizio e ricevere messaggi, organizzati in maniera gerarchica (es.: org.freedesktop.DBus), mandare messaggi, aprire una sessione, eventualmente con tanto di autenticazione.

Ad esempio, con DBus + udev potrei fornire un servizio che mi dice se qualcuno ha attaccato un dispositivo usb, eventualmente permettendo al client di richiedere delle azioni da intraprendere (chiedere che tipo di dispositivo è, elencare le azioni disponibili fornite dal driver ... beh, non esageriamo con la duttilità, potrebbe diventare complesso). Ancora, con DBus + UDisk2 posso aprire la finestra di una cartella di un dispositivo di storage appena inserito, ad esempio.

Se ho un dispositivo piccolino, senza desktop, tipo RaspberryPI, posso usare dbus e la sua interfaccia node, https://github.com/sidorares/node-dbus, per capire se è stato inserito un dispositivo usb, in tal caso presentare il servizio disponibile sulla interfaccia web (usando websocket (push) o usando una richiesta attiva) e permettendo di intraprendere azioni. Se ad esempio inserisco un device di storage, posso metterlo a disposizione come target per un trasferimento, se inserisco una webcam potrei fornire lo stream video su di una porta o servizio, etc.

Ovviamente ci sono binding DBus per diversi linguaggi. Quel che ho capito è che non è strettamente necessario il concetto di desktop per farne uso, è qualcosa di complesso, un IPC, con le sue caratteristiche, pro e contro, ma con dei servizi di partenza standard che potrebbero essere interessanti per arrivere dritti al punto. DBus != Desktop bus, anche se è stato pensato/creato per questo.

Approfondisco un po' perché mi interessa usare ZeroMQ per altri progetti, pare, http://comments.gmane.org/gmane.comp.freedesktop.dbus/12827, che DBus sia meno efficiente di ZMQ, e anche di CORBA, ma ha altre caratteristiche necessarie come la gestione della sicurezza, ma deficia di altre presenti in ZMQ.

ZMQ è più articolato di quanto mi aspettassi. Ad esempio ci sono diverse modalità di aprire un canale, ovvero diversi patterns. Ma in definitiva è facile da capirsi.

La conclusione è che andrò ad utilizzare ZMQ per un piccolo applicativo, sostanzialmente perché ZMQ è quello che abbiano pianificato di usare anche in un altro progetto che ha bisogno di essere distribuito su più macchine, ma l'aver dato un'occhiata a DBus l'ha reso meno misterioso.