Frage

Wir haben eine Client-Anwendung, die Nachrichten an einen Server für verschiedene Mitteilungen senden muss. Damit der Kunde gelegentlich werde verbunden laufen kann ich mit einem Message-Queue Ansatz gehen. Die Warteschlange Verarbeitung dauert Nachrichten aus der Warteschlange und einen Web-Service aufrufen, die sie auf eine andere Warteschlange gestellt wird, um schließlich weiterverarbeitet werden. Diese Frage bezieht sich auf die Client-Umgebung; die Server-Umgebung ist bereits entschieden.

Ich will nicht MSMQ verwenden, weil wir die Kunden haben keine Kontrolle über alle PCs um / configure und sicher MSMQ ordnungsgemäß zu installieren, und weil die Unterstützung schwieriger aufgrund der Qualität der Werkzeuge, die für die Untersuchung der Inhalte ist MSMQ von Warteschlangen. SQL Server 2005 Express ist auf allen Maschinen, und verwendet wird, um Daten für unsere Anwendung zu speichern.

Ich habe es derzeit zwei Möglichkeiten unten:

  1. eine ziemlich grundlegende persistent Nachricht-Warteschlange schreiben, die die Nachrichten in einer Tabelle speichert sie nach Serialisierung, verwendet ThreadPool.QueueUserWorkItem sie durch Handler gegen jeden Nachrichtentyp konfiguriert verarbeitet zu haben. Alle in einem System.Transactions.TransactionScope, so dass sie nur von der beständigen Warteschlange entfernt werden, wenn sie erfolgreich verarbeitet werden.
  2. Verwenden Sie NServiceBus (dies ist der Servicebus wir als Team gegangen sind, so Masstransit etc sind keine Optionen) auf dem Client, mit einem Service Broker Transport, die die lokale Datenbank verwendet.

Ich habe wenig Erfahrung mit Service-Bussen (ich weiß noch nicht wirklich Servicebus Terminologie erhalten), so bin ich besorgt über die Lernkurve im Vergleich etwas viel einfacher zu schreiben, die meine Anforderungen in der Art und Weise erfüllt ich es muß ( Deployment ist eine groß Betrachtung).

Hat jemand irgendwelche Gedanken?

War es hilfreich?

Lösung 3

Am Ende habe ich einen Grund messagebus mit meinem eigenen SqlTransport so konfigurierte, dass Nachrichten serialisiert und zu einer SQL Server-Datenbank-Tabelle gespeichert, bevor die Ereignisse ausgelöst werden und ein separater Thread signalisiert wird, um die Nachrichten zu verarbeiten.

Andere Tipps

Nun, ich weiß nicht, dass ich werde MSMQ vorschlagen, aber ich werde vorschlagen, dass viele Grenzfälle gibt es, darüber nachzudenken, für ‚rollen Sie Ihre eigenen‘.

Auch bei einem Thread-Pool-Ansatz, beachten Sie, dass es möglicherweise Probleme der Bestellung, wenn Sie sich interessieren - zwei bereitgestellte Elemente sequentiell Pools einzufädeln kann nicht in der Reihenfolge ausgeführt werden, da, wie die Thread-Pools Griff Workitems.

Sie müssen auch über Persistenz von Nachrichten denken, und wie lange sie existieren, wie ‚fatal‘ Nicht-Auslieferungszustand zu erfassen, und das, was in diesem Fall zu tun ist.

Es gibt auch eine Reihe von möglichen Grenzfällen in Szenarien, in denen Sie Ihre App nach unten um die gleichen Zeit geht, wie es eine Message Queuing - zum Beispiel, kann es nicht die Bestätigung erhält, dass die Nachricht der Warteschlange gestellt wurde, obwohl es war. Ja, können Sie die Warteschlange Bestätigung ack, aber man kann in ack Kreise endlos bekommen ...

Warum nicht einfach haben die App erkennt, wenn es verbunden wird, und alle Daten zu diesem Zeitpunkt senden?

Nachdem wir unsere eigenen Service-Bus geschrieben Ich kann Ihnen sagen, es ist keine triviale Unternehmen und Sie werden in die gleichen Grenzfälle ausführen, die alle anderen Implementierer bereits laufen in. Kyoryu bringt zwei sehr wichtige.

Ob Sie Ihre eigene Rolle hängt auch von den Fähigkeiten, die Sie im Haus haben und in der Zukunft, um die Lösung beizubehalten.

Eine weitere Überlegung ist die mögliche Umfang des Systems und es ist Zuverlässigkeitsanforderungen. Wird die in-house Lösung ausreichend skalieren?

Unser Peer-to-Peer-Message-Bus, Zebus, basierend auf ZeroMq (Verkehr), Cassandra (Peer Discovery und Persistenz) und Protobuf (Serialisierung).

  1. Keine Client-Bereitstellung auf dem Client ist es nur eine Bibliothek
  2. Nachrichtenpersistenz ist auch mit Cassandra zur Verfügung gestellt und behandelt viele verschiedene Grenzfälle (dies ist in unserer Produktionsumgebung regelmäßig getestet)
  3. Es funktioniert gut und da es eine brokerless Lösung ist, ist es nicht eine einzige Performance-Engpass
  4. Es gibt keine einzelne Fehlerquellen als das Verzeichnis mit einem verfügbaren Datenspeicher wie Cassandra
  5. verwendet werden

Es ist Open-Source und Produktion getestet https://github.com/Abc-Arbitrage/Zebus

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top