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