2013-12-23 6 views
20

Ich bin ziemlich neu in diesen High Concurrency Paradigmen, und ich habe begonnen, die Scala RX-Bindungen zu verwenden. Also versuche ich zu verstehen, wie sich RX von Messaging-Warteschlangen wie RabbitMQ oder ZeroMQ unterscheidet?RX vs Messaging-Warteschlangen wie Rabbitmq oder Zeromq?

Sie scheinen beide das Subscribe/Publish-Paradigma zu verwenden. Irgendwo habe ich einen Tweet darüber gesehen, dass RX auf RabbitMQ läuft.

Kann jemand die Unterschiede zwischen RX und Nachrichtenwarteschlangen erklären? Warum sollte ich eins über das andere wählen? Kann man das andere ersetzen oder schließen sie sich gegenseitig aus? In welchen Bereichen überschneiden sie sich?

+2

Warteschlangen Sie Warteschlangen. Rx nicht. Rx ist nicht verteilt. Rx ist Paradigma der Ereignisverarbeitung, nicht nur Pub/Sub. Ereignisse sind Pub/Sub-Paradigma. –

Antwort

21

Es lohnt sich, auf den learn more Link auf dem [system.reactive] Tag zu klicken, wir haben ein gutes Stück Information dort hingelegt!

Vom Intro dort kann man sehen, dass Rx Queuing-Technologie nicht eine Nachricht ist:

Die Reactive Extensions (Rx) ist eine Bibliothek für das Komponieren asynchrone und ereignisbasierte Programme mit beobachtbaren Sequenzen und LINQ-Stil Abfrageoperatoren. System.Reactive ist der Root-Namespace, der in der Bibliothek verwendet wird. Mit Rx stellen Entwickler asynchrone Datenströme mithilfe von LINQ-Operatoren dar und parametrisieren die Parallelität in den asynchronen Datenströmen mithilfe von Zeitplänen. Einfach gesagt, Rx = Observables + LINQ + Scheduler.

Also, Rx und Message Queuing sind wirklich unterschiedliche Technologien, die sich gut ergänzen können. Ein klassisches Beispiel ist ein Börsenticker-Service - dieser kann über Message Queuing geliefert werden, wird dann aber von Rx in Gruppen-, Aggregations- und Filterpreise umgewandelt.

können Sie noch weiter gehen: viel wie Entity Framework stellt sich IQueryable<T> Abfragen in SQL laufen direkt auf der Datenbank können Sie Anbieter erstellen, die Rx IQbservable<T> Abfragen in native Abfragen drehen - zum Beispiel ein Where Filter kann die native Filterfunktion nutzen, die vorhanden ist in vielen Message Queuing-Technologien, um Filter direkt anzuwenden. Das ist eine Menge Arbeit und schwer.

Es ist viel einfacher und nicht selten Nachrichten Nachrichtenwarteschlangen zu sehen in einem Rx Subject, so dass eingehende Nachrichten aus einer Warteschlange in einen Rx-Stream für den einfachen Verbrauch im Client umgewandelt werden. Rx wird auch häufig in GUIs verwendet, um mit clientseitigen Ereignissen wie Schaltflächen- und Textfeldänderungen zu arbeiten, um traditionell schwierige Szenarien wie Drag-and-Drop und die automatische Vervollständigung von Text über asynchrone Serverabfragen erheblich einfacher zu machen. Es gibt eine gute Hands-on-Lab für das spätere Szenario here. Es wurde gegen eine vorzeitige Veröffentlichung von Rx geschrieben, ist aber immer noch sehr relevant.

Ich empfehle diese Videopräsentation von Bart de Smet für ein fantastisches Intro: Curing Your Event Processing Blues with Reactive Extensions (Rx) - einschließlich der klassischen Rx-Demo, die eine Anfrage über einen Live-Feed von Kinect schreibt, um Hand-waving zu interpretieren!

+0

Schöne Antwort! Sie müssen jedoch mit Ihrer Definition von Reactive Extensions (Rx) vorsichtig sein und auf welche Implementierung Sie sich beziehen. Zum Beispiel enthalten Rx-Erweiterungen für Javascript keine Scheduler etc. – arcseldon

+0

Bedenken Sie, dass 'system.reactive' Tag ist die ursprüngliche .NET-Version, so nahm ich an, dass bei der Beantwortung. –

+1

fairer Punkt, aber ich bin weniger klar, ob das OP nach einer .NET-spezifischen Antwort gefragt hat. Keine Erwähnung davon in der Frage. Mein Kommentar ist nicht, Ihre ausgezeichnete Antwort zu kritisieren, sondern nur, um andere Implementierungsperspektiven zu berücksichtigen. – arcseldon

8

Kann jemand die Unterschiede zwischen RX und diesen anderen Nachrichtenwarteschlangen erklären?

Rx ist einfach eine Abstraktion über Ereignisse (jede Art von Ereignis!). Empfangen einer Nachricht von einer verteilten Warteschlange ist ein Event, und oft ZeroMQ/RabbitMQ-Lösungen müssen oft verschiedene Ereignisse verwenden und kombinieren ziemlich viel, die Rx ist sehr gut.

So oft macht Rx Schreiben ZeroMQ/RabbitMQ apps viel einfacher, als es sonst der Fall wäre :)

+0

Ihre Antwort klingt gut - bitte können Sie mit Beispielen verknüpfen, wo Rx und RabbitMQ kooperativ verwendet werden - Zum Beispiel haben Sie Github Repo Demos etc, wo Rx als der Verbraucher eines Kaninchen Warteschlange usw. verwendet wird. Oder können Sie bitte Skelett-Code in Ihre Antwort einfügen. – arcseldon

+0

Ich könnte einige Investmentbanken nennen, die das tun, aber ich will nicht verklagt werden. :) Es genügt zu sagen, ich kann bestätigen, dass es ein häufiges Szenario ist. –