我有一个演员,他的工作是对Mongo数据库进行一些更新操作。我向它发送一条包含名称值对的消息,它会在Mongo文档中创建或更新一个字段。
该值可以是int,double或bool。我如何最好地设计要发送给演员的消息?性能和可伸缩性是此应用程序中的一个问题。我看到了三种可能的方法:
为每种数据类型实施不同的消息,然后使用处理程序采取适当的行动。
在单个消息中将值作为对象传递,然后转换为适当的类型并执行数据库操作。
使用通用类消息以某种方式发送类型T的值,然后在单个处理程序中对其进行正确处理。请注意,这似乎很理想,但是我还没有弄清楚如何正确构造这些消息。
非常感谢您提供一些有关如何最好地解决此问题的见识。
答案 0 :(得分:0)
经过进一步思考和快速测试,我决定使用一种消息,其中每种类型都包含一个变量。...
公共类UpdateMessage(字符串名称,布尔值布尔,双精度值Dbl,整数valueInt)
这可以防止装箱问题,并允许我使用单个消息和处理程序。反馈表示赞赏。
答案 1 :(得分:0)
所以我和演员完全一样的挑战。我发布此消息是因为这是Google上的最重要问题。通过on Recieve方法接收参数化的泛型类型
public partial class CacheDataStoreActor : UntypedActor
{
private DataStore.IDataStoreConnector _dataStore;
public CacheDataStoreActor(DataStore.IDataStoreConnector dataStore)
{
_dataStore = dataStore;
}
public static Props Create(DataStore.IDataStoreConnector dataStore)
{
return Props.Create(() => new CacheDataStoreActor(dataStore));
}
protected override void OnReceive(object message)
{
switch (message)
{
case SaveItemCmd request:
Task.Run(async () => await ProcessSaveItemCmd(request)).PipeTo(Sender);
break;
default:
//using the default case then passing the generic type
//as a dynamic to the target method
Task.Run(async () => await ProcessRetrieveItemQuery(message as dynamic)).PipeTo(Sender);
break;
}
}
然后方法本身将照常接受参数化的泛型类型(类似这样的东西)
private async Task<T> ProcessRetrieveItemQuery<T>(RetrieveItemQuery<T> request)
{
return await _dataStore.RetrieveItem<T>(request.Key, request.QueryFilter);
}