Akka.net通用类型消息

时间:2018-08-10 23:54:17

标签: akka.net

我有一个演员,他的工作是对Mongo数据库进行一些更新操作。我向它发送一条包含名称值对的消息,它会在Mongo文档中创建或更新一个字段。

该值可以是int,double或bool。我如何最好地设计要发送给演员的消息?性能和可伸缩性是此应用程序中的一个问题。我看到了三种可能的方法:

  1. 为每种数据类型实施不同的消息,然后使用处理程序采取适当的行动。

  2. 在单个消息中将值作为对象传递,然后转换为适当的类型并执行数据库操作。

  3. 使用通用类消息以某种方式发送类型T的值,然后在单个处理程序中对其进行正确处理。请注意,这似乎很理想,但是我还没有弄清楚如何正确构造这些消息。

非常感谢您提供一些有关如何最好地解决此问题的见识。

2 个答案:

答案 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);
    }