2016-11-09 9 views
1

私はServiceStack MQ Server/Clientを使用して自分のプラットフォームでメッセージベースのアーキテクチャを強化してきており、完璧に動作しています。私は現在、SSメッセージプロデューサ/コンシューマによってサポートされているとは思わない何かをしようとしています。ServiceStackメッセージフィルタリング

本質的に私は集中データセンターでメッセージ(イベント)を発しています。このイベントについて潜在的に知る必要がある信頼できないネットワークを介して、米国全土に約2000の分散ノードがあります〜2000ノードのうちの1つにのみ接続します。私はPub/Subで任意の名前のチャンネルの柔軟性を必要としますが、MQの耐久性は必要です。私はPub/Subで始まったが、ネットワークはあまりにも信頼性が低いので、RedisMQServerを使用するようにソリューションを移動した。私はそれが働いているが、私はインターフェイスで何かを逃していないことを確認したかった。 SSの作成者がこのユースケースを考えているのであれば、私は興味があります。もしそうなら、その議論の結果はどうでしたか?これは、POCOを使用してメッセージ消費の成果/行動を推進するというコンセプトに反する。多分それが理由ですか?ここで

は、ここに私のプロデューサー

public ExpressLightServiceResponse Get(ExpressLightServiceRequest query) 
    { 
     var result = new ExpressLightServiceResponse(); 

     var assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("ArbitaryNamespace"), AssemblyBuilderAccess.Run); 
     var moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName"); 
     var typeBuilder = moduleBuilder.DefineType(string.Format("EventA{0}", query.Store), TypeAttributes.Public); 

     typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); 

     var newType = typeBuilder.CreateType(); 

     using (var messageProducer = _messageService.CreateMessageProducer()) 
     { 
      var message = MessageFactory.Create(newType.CreateInstance()); 
      messageProducer.Publish(message); 
     } 

     return result; 
    } 

である、これは私を与えるもの、私の消費者

public class ServerAppHost : AppHostHttpListenerBase 
{ 
    private readonly string _store; 

    public string StoreQueue => $"EventA{_store}"; 

    public ServerAppHost(string store) : base("Express Light Server", typeof(PubSubServiceStatsService).Assembly) 
    { 
     _store = store; 
    } 

    public override void Configure(Container container) 
    { 
     container.Register<IRedisClientsManager>(new PooledRedisClientManager(ConfigurationManager.ConnectionStrings["Redis"].ConnectionString)); 

     var assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("ArbitaryNamespace"), AssemblyBuilderAccess.Run); 
     var moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName"); 
     var typeBuilder = moduleBuilder.DefineType(StoreQueue, TypeAttributes.Public); 

     typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); 

     var newType = typeBuilder.CreateType(); 

     var mi = typeof(Temp).GetMethod("Foo"); 
     var fooRef = mi.MakeGenericMethod(newType); 
     fooRef.Invoke(new Temp(container.Resolve<IRedisClientsManager>()), null); 
    } 
} 

public class Temp 
{ 
    private readonly IRedisClientsManager _redisClientsManager; 

    public Temp(IRedisClientsManager redisClientsManager) 
    { 
     _redisClientsManager = redisClientsManager; 
    } 

    public void Foo<T>() 
    { 
     var mqService = new RedisMqServer(_redisClientsManager); 
     mqService.RegisterHandler<T>(DoWork); 
     mqService.Start(); 
    } 

    private object DoWork<T>(IMessage<T> arg) 
    { 
     //Do work 
     return null; 
    } 
} 

は、キューの耐久性を持つパブ/サブの柔軟性です。誰もがこれを達成するためのより "ネイティブな"方法を見たり知っていますか?

答えて

0

しかありませんので、私は、まず自分のラッパークラスからそれを削除し、それだけでハンドラを登録してい、例えばだろうあなたのAPPHOSTに登録1 MQホストする必要があります:

public override void Configure(Container container) 
{ 
    //... 

    container.Register<IMessageService>(
     c => new RedisMqServer(c.Resolve<IRedisClientsManager>()); 
    var mqServer = container.Resolve<IMessageService>(); 

    fooRef.Invoke(new Temp(mqServer), null); 

    mqServer.Start(); 
} 

public class Temp 
{ 
    private readonly IMessageService mqServer; 
    public Temp(IMessageService mqServer) 
    { 
     this.mqServer = mqServer; 
    } 

    public void Foo<T>() => mqService.RegisterHandler<T>(DoWork); 
} 

しかし、このアプローチではありませんServiceStackに適しています。これは、クライアント/サーバが送受信するメッセージを処理するために使用するサービスコントラクトを定義するコードファーストメッセージの使用を促します。だからカスタムメッセージを送信するためにServiceStackを使いたいのであれば、メッセージごとに別々のクラスを持つか、それ以外の場合はSendEventのようなジェネリックタイプを持つことをお勧めします。メッセージやイベントタイプはクラスのプロパティです。

カスタムメッセージがRedisMqServerを使用しないで継続したい場合はそうでない場合は、あなただけdedicated MQ like Rabbit MQを使用するか、Redis List directly使用好む場合 - その下にあるすべてのRedisのMQの使用データ構造です。