none
Globale Object-Caching und Service Bus Replay?

    Frage

  • Hi, ich habe dies mal 2 verschiedene Frage über den Service Bus Replay und den Caching Dienst.

    Fachliche Frage zum "Caching Dienst"
    Verstehe ich so richtig, Caching Dienst ist ähnlich wie ein Storage, der aber auf Arbeitspeicher befindet ist? Sodass die Daten schnell zugegriffen werden können?

    Kann ich den Caching Dienst ausnutzen/manipulieren um ein Global Object zu implementieren?
    Beispiel: Ich habe ein Service Dienst (Worker Role), für jeden Funktionaufruf, wird ca. 100MB Speicher geladen um ein Objekt zu erstellen, dieses Objekt wird nach dem Berechnen gelöscht um den Speicher (RAM) frei zu geben. Es kostet aber eine menge Zeit um dieses Objekt wieder zu instanzieren. Daher haben wir so gelöst.
    Bisherige Lösung: Solche Objekte werden erstellt aber nie gelöscht (statische private Atts), es führt dazu, dass der Arbeitspeicher andauern belastet ist, d.h. der RAM wird unnötigt belastet! Weil wir 5GB RAM verbraten , bei kleineren Instanzen wäre diese Option keine Lösung und auf Dauer ist es total unschön.
    Gesuchte Ansatz: Ich frage mich ob es möglich ist, solche Objekte einmalig im "Cache-Dienst" zu instanzieren und evt. global (innerhalb eines Worker Role-Services) zu bereitstellen, sodass andere Instanzen zugreifen könnten?

    Fachliche Frage zum "Service Bus Replay"
    Wenn ich eine Berechnung an Server schicke, wird die Frage an die Queue hinzugefügt und bekomme eine "DummyReplay" zurück? Sobald die Berechnung (wirklich) fertig ist, wird mein Client eine Benachrichtigung bekommen um das richtige Ergebnis zu holen? Bzw. Service Bus Replay versucht den Client ständig zu erreichen um das Ergebnis zu liefern?
    https://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-relay/

    Dieses Service ist besonders interessant weil das "Firewall-Problem" wahrscheinlich umgehen/aufgehoben wird??
    Ich habe leider kein Codebeispiel finden können und verstehe irgendwie noch nicht ganz, wie man den "Service Bus Replay" programmiertechnisch umsetzen könnte.

    Mit freundlichen Grüßen
    Nghia

    Freue mich wieder auf eure Hilfe.

    Dienstag, 20. November 2012 15:15

Antworten

  • Hallo Nghia,

    zu Deinen Fragen:

    zu 1 (Wenn ich ein Objekt gecacht habe...):
    Das Objekt wird übertragen. Muss es ja auch, da es ja nicht unbedingt im gleichen Speicher liegt. Es könnte ja sein, dass es im Speicher einer anderen Instanz liegt. Das ist auch ein Grund dafür, warum zu cachende Objekte serialisierbar sein müssen.

    zu 2 (Was würde passieren...):
    Nein, die beiden Instanzen bekommen Änderungen nicht synchron mit. Jede arbeitet mit ihrer eigenen Kopie.

    zu 3 (Wie viel Cache-Speicher...):
    Theoretisch kannst Du unendlich viel Cache-Speicher einrichten. Der Speicher wird durch drei Faktoren bestimmt:
    1. die Zahl der Instanzen, für die Du Cache konfiguriert hast
    2. die Größe der Instanzen, für die Du Cache konfiguriert hast
    3. den Anteil, den Du in den Instanzen für Cache reservierst
    Beispiel: XL Instanzen haben jeweils 14 GB RAM, wenn Du drei Instanzen hast und jeweils 50% für Cache reservierst, hast Du 3 x 50% x 14 GB = 21,5 GB Cache.

    zu 4 (Service Relay Bus...):
    Wenn Dein Client an den Relay eine Anfrage schickt, bekommst Du entweder die Antwort des Service zurück (wenn der Service empfangsbereit ist) oder eine Exception (wenn der Service nicht empfangsbereit ist)

    zu 5 (Wenn ich als Server/Service...):
    Ja, so ist es. Der ganze Mechanismus erfolgt automatisch durch den Service Bus. Siehe auch das Beispielprojekt unten.

    zu 6 (In welcher Form...):
    Das Service Bus Relay funktioniert synchron. D.h. der Client wartet solange bis er entweder eine Antwort über das Relay bekommt oder einen Timeout. Der Client ist also solange blockiert, bis eine Antwort bekommt. Wenn Du das nicht möchtest, dann musst Du z.B. eine Service Bus Queue verwenden. Dabei kann der Client weiterarbeiten, sobald seine Nachricht in der Queue steht. Dann musst Du allerdings selbst implementieren, wie der Client eine Antwort bekommt.

    zu 7 (Können mehrere Instanzen...):
    Ja.

    Unter folgendem URL kannst Du Dir ein Beispielprojekt für das Service Bus Relay herunterladen. Das ist ein simpler Echo-Service, der eine Textnachricht bekommt und gleich wieder zurück schickt: http://hsirtl.blob.core.windows.net/codesamples/AzureInfodaySampleAppFabricSB17.zip

    Das Beispiel funktioniert bei mir. Ist zwar eine VS2012-Solution. Die sollte aber auch unter VS2010 funktionieren. Du musst nur in die beiden Program.cs-Dateien (beim Client und beim Service) Deine eigenen Credentials Deines Service Bus eintragen.

    Viele Grüße,

    Holger

    PS: bitte verteile in Zukunft Deine Fragen in diesem Forum thematisch auf verschiedene Anfragen. Jetzt sind in diesem Thread Fragen zum Cache, zum Service Bus und zum Blob-Storage. Später findet dann keiner mehr die einzelnen Themen. Besser wäre eine Frage zum Cache, eine Frage zum Service Bus und eine Frage zum Blob-Storage.


    Holger Sirtl Senior Technical Evangelist, Microsoft Deutschland GmbH http://blogs.msdn.com/hsirtl

    Montag, 3. Dezember 2012 09:52

Alle Antworten

  • Hallo LocomTester,

    Für die erste Frage die Antwort ist Ja es ist wie ein Storage. Hier findest Du mehrere Infos: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/AAP314

    Für die Service Bus Replay Frage was für Beispiele meinst Du? Es gibt einige Beispiele in den Link die Du gepostet hast.

    Gruß,

    Ionut

    Donnerstag, 22. November 2012 09:47
    Moderator
  • Hallo Nghia,

    ja, Du verstehst den Cashing Dienst grundsätzlich richtig.

    Bitte beachte, dass es unter Windows Azure zwei Arten von Caching gibt. Zum einen gibt es das Shared Caching. Das ist der Caching Service, den du im alten Portal unter deinem Namespace anlegen kannst. Jeder deiner Dienste, der auf diesen Namespace zugreifen kann, kann dann diesen Caching Service nutzen. Die Roadmap dieses Caching Service ist allerdings unklar. Besser, du verwendest die zweite Art des Caching Service. Dabei kannst du innerhalb eines Cloud Service entweder anteilig Ressourcen deiner Rollen oder spezielle Caching Rollen zum Caching einsetzen. In Visual Studio kannst du dies unter den Propertys deiner Rollen tun. Siehe auch folgende Abbildung.

    Für weitere Informationen zum Caching Service empfehle ich dir folgende Ressourcen:

    Zum Service Bus Relay:

    Ja, so kannst Du das implementieren. Wenn Du eine Queue verwendest, bekommst Du keine DummyReply sondern einfach eine Rückmeldung, dass Deine Nachricht erfolgreich versendet wurde. Wenn die Worker Role Deine lokale Anwendung aufrufen soll, kannst Du das ebenfalls über den Service Bus realisieren. Am besten Du schaust Dir folgendes Video an, da zeige ich das: http://www.youtube.com/watch?v=TsmLD1DQUVU.

    Ansonsten empfehle ich Dir die Seite https://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-relay/, die Du ja schon angegeben hast. Ist ein guter Einstieg.

    Viele Grüße,

    Holger


    Holger Sirtl Senior Technical Evangelist, Microsoft Deutschland GmbH http://blogs.msdn.com/hsirtl

    Donnerstag, 22. November 2012 10:05
  • Caching Theory habe ich alles verstanden, aber der Emulator für Caching funktioniert es nicht? Es startet und startet ... startet aber nie vollständig.


    Service Bus ist irgendwie schwer zu implementieren oder es funktioniert etwas bei mir nicht richtig.
    Ich benutze "Relayed Messaging Bindings NetTcp MsgSec UserName" und habe quasi nur meine Daten geändert, trotzdem kann ich kein Host.open()! Liegt es an VS2010?

    Komisch ... jetzt erst mal weekend, nächste woche geht es weiter.

    Viele Grüße
    Nghia

    Donnerstag, 22. November 2012 13:58
  • HM....
    Cache und Service Bus Relay lässt sich bei mir nicht implementieren(mit Emulator), daher erhoffe ich auf eure Hilfe.

    Cache kann ich leider nicht ausprobieren, die .config Einstellung funktioniert bei mir nicht ... Ein Service auf Service-Replay (Emulator) lässt sich bei mir nicht hosten!

    • Wenn ich ein Objekt gecacht habe und dieses Objekt benutzen würde, wird dieses Objekt übertragen/kopiert oder wird nur ein Verweis auf das Objekt zurück gegeben. D.h. Das Programm merkt es nicht, ob das Objekt ein Cache-Objekt oder ein normale Objekt ist? Cache Reference Data, Cache Activity Data, Cache Resource Data?
    • Was würde passieren, wenn dieses Objekt von 2 Benutzer/Instanzen gleichzeitig benutzt werden möchte? Bekommen beide Instanzen die Änderungen synchron mit?
    • Wieviele Cache-Speicher steht mir zu verfügung, wenn ich z.B. "3 XL Instanze Worker Role" beim 50% mit hoher Verfügbarkeit bzw. (ohne Verfügbarkeit) einrichten würde? 7GB bei hoher Verfügbarkeit und 21GB bei ohne hoher Verfügbarkeit?
    • Service Relay Bus konnte ich leider auch nicht umsetzen ... Wenn ich als Client ein Request an Serivce-Relay geschickt habe, was genau erhalte ich als Antwort zurück?
    • Wenn ich als Server/Service eine Nachricht aus dem Service-Relay entnehme und verarbeite, wie funktioniert es dann mit dem "Beantworten", das Service schickt zunächst eine Antwort an Service-Relay und Service-Relay schickt eine Benachrichtigung an Client?
    • In welcher Form findet diese Benachrichtigung statt? Wird der Client aufgefordert die Antwort zu holen? Oder verschickt das Service-Relay gleich die Antwort an Client mit?
    • Können mehrere Instanzen auf den selben BLOB-Container lesen und schreiben?

    Auf eure Hilfe würde ich mich sehr freuen, ein Example Projekt (die funktioniert) auf VS2010 mit .Net 4 würde ich sehr freuen, ich habe viele projekt und Code ausprobiert, leider ohne erfolg.

    Viele Grüße
    Nghia

    Computer System.
    Window 7 64 Bit
    VS2010 Prof.
    Azure .NET 1.7
    Emulator Version 1.8
    FrameWork 4.0


    • Bearbeitet LocomTester Freitag, 30. November 2012 10:03
    Freitag, 30. November 2012 09:56
  • Hallo Nghia,

    zu Deinen Fragen:

    zu 1 (Wenn ich ein Objekt gecacht habe...):
    Das Objekt wird übertragen. Muss es ja auch, da es ja nicht unbedingt im gleichen Speicher liegt. Es könnte ja sein, dass es im Speicher einer anderen Instanz liegt. Das ist auch ein Grund dafür, warum zu cachende Objekte serialisierbar sein müssen.

    zu 2 (Was würde passieren...):
    Nein, die beiden Instanzen bekommen Änderungen nicht synchron mit. Jede arbeitet mit ihrer eigenen Kopie.

    zu 3 (Wie viel Cache-Speicher...):
    Theoretisch kannst Du unendlich viel Cache-Speicher einrichten. Der Speicher wird durch drei Faktoren bestimmt:
    1. die Zahl der Instanzen, für die Du Cache konfiguriert hast
    2. die Größe der Instanzen, für die Du Cache konfiguriert hast
    3. den Anteil, den Du in den Instanzen für Cache reservierst
    Beispiel: XL Instanzen haben jeweils 14 GB RAM, wenn Du drei Instanzen hast und jeweils 50% für Cache reservierst, hast Du 3 x 50% x 14 GB = 21,5 GB Cache.

    zu 4 (Service Relay Bus...):
    Wenn Dein Client an den Relay eine Anfrage schickt, bekommst Du entweder die Antwort des Service zurück (wenn der Service empfangsbereit ist) oder eine Exception (wenn der Service nicht empfangsbereit ist)

    zu 5 (Wenn ich als Server/Service...):
    Ja, so ist es. Der ganze Mechanismus erfolgt automatisch durch den Service Bus. Siehe auch das Beispielprojekt unten.

    zu 6 (In welcher Form...):
    Das Service Bus Relay funktioniert synchron. D.h. der Client wartet solange bis er entweder eine Antwort über das Relay bekommt oder einen Timeout. Der Client ist also solange blockiert, bis eine Antwort bekommt. Wenn Du das nicht möchtest, dann musst Du z.B. eine Service Bus Queue verwenden. Dabei kann der Client weiterarbeiten, sobald seine Nachricht in der Queue steht. Dann musst Du allerdings selbst implementieren, wie der Client eine Antwort bekommt.

    zu 7 (Können mehrere Instanzen...):
    Ja.

    Unter folgendem URL kannst Du Dir ein Beispielprojekt für das Service Bus Relay herunterladen. Das ist ein simpler Echo-Service, der eine Textnachricht bekommt und gleich wieder zurück schickt: http://hsirtl.blob.core.windows.net/codesamples/AzureInfodaySampleAppFabricSB17.zip

    Das Beispiel funktioniert bei mir. Ist zwar eine VS2012-Solution. Die sollte aber auch unter VS2010 funktionieren. Du musst nur in die beiden Program.cs-Dateien (beim Client und beim Service) Deine eigenen Credentials Deines Service Bus eintragen.

    Viele Grüße,

    Holger

    PS: bitte verteile in Zukunft Deine Fragen in diesem Forum thematisch auf verschiedene Anfragen. Jetzt sind in diesem Thread Fragen zum Cache, zum Service Bus und zum Blob-Storage. Später findet dann keiner mehr die einzelnen Themen. Besser wäre eine Frage zum Cache, eine Frage zum Service Bus und eine Frage zum Blob-Storage.


    Holger Sirtl Senior Technical Evangelist, Microsoft Deutschland GmbH http://blogs.msdn.com/hsirtl

    Montag, 3. Dezember 2012 09:52
  • Hi Holger, ich werde nächstes Mal auf die Thematik aufpassen.

    Ich habe das Projekt genommen und meine Daten eingegeben, beim Hosten ( host.Open() ) kommt dann die CommunicationException "Unable to connect to ServiceBus using HTTP connectivity mode" ...


    Meine Daten habe ich so angegeben

                string serviceNamespace = "locomrelay";
                string issuerName       = "owner";
                string issuerSecret = "soK4oKT8XXXXXXXXXXXXXXXXXXXXXXXXXXX=";
    Danke für deine Mühe

    Nghia
    Dienstag, 4. Dezember 2012 12:18
  • Hallo Nghia,

    Deine Einstellungen sehen gut aus. Ich gehe mal davon aus, dass Du im ServiceBus einen Namespace mit Namen 'locomrelay' angelegt hast.

    Ich vermute, dass das Problem in der Netzwerkverbindung zum ServiceBus liegt. Ggf. lässt Dein Proxy keinen entsprechenden Traffic zu. Schau Dir mal diesen Thread an:

    http://social.msdn.microsoft.com/Forums/en-US/windowsazuremanagement/thread/40c8df39-c6b1-4f7d-be4c-65642bf14c43

    Darüber hinaus kann ich Dir auch noch den folgenden Blogpost empfehlen:

    http://www.jayway.com/2011/05/12/windows-azure-servicebus-pitfalls/

    Viele Grüße,

    Holger


    Holger Sirtl Senior Technical Evangelist, Microsoft Deutschland GmbH http://blogs.msdn.com/hsirtl

    Dienstag, 4. Dezember 2012 12:49
  • Ich habe unseren Admin gefragt, er sagte mir, dass keine IPs bei uns blockiert ist, es sei ein Port-Problem.

    host.BaseAddresses[0].Port hat tatsächlich bei mir  den Wert "-1", ist es normal?

    Es ist wirklich merkwürdig ...

    Viele Grüße
    Nghia
    Dienstag, 4. Dezember 2012 13:42
  • Hi,

    Clemens Vasters hat in oben genannten Thread noch folgenden Hinweis gegeben:

    Your proxy only supports HTTP/1.0. Our HTTP tunneling capabilty requires HTTP/1.1 compliant proxies.

    We'll be adding an explicit HTTPS tunneling capability in one of the next releases (with some luck in the next one) that will allow getting this scenario to work through proxies that are still operating on a pre-1999 technology status quo.

    Kann es daran liegen?

    Viele Grüße,

    Holger


    Holger Sirtl Senior Technical Evangelist, Microsoft Deutschland GmbH http://blogs.msdn.com/hsirtl

    • Als Antwort markiert LocomTester Freitag, 7. Dezember 2012 10:38
    • Tag als Antwort aufgehoben LocomTester Freitag, 7. Dezember 2012 10:38
    Mittwoch, 5. Dezember 2012 09:54
  • Das wäre die einzige Erklärung, warum keine Verbindung aufgebaut werden kann ...
    Danke
    Freitag, 7. Dezember 2012 10:37