模型和定制

Riker需要Model来设置整个系统中使用的消息类型,并指定提供核心服务的模块。 Model是一个可以在Rust类型上实现的特性,然后用于创建ActorSystem。

Model Trait

让我们来看看Model特征:

  1. pub trait Model : Sized {
  2. /// The message type used throughout the system.
  3. /// `Actor.receive` expects this type
  4. type Msg: Message;
  5. /// Dispatcher executes actors and futures
  6. type Dis: Dispatcher;
  7. /// Logger provides global logging, e.g. info!("hello");
  8. type Log: LoggerProps<Msg = Self::Msg>;
  9. /// Dead letters subscribes to the dead letters channel
  10. type Ded: DeadLetterProps<Msg = Self::Msg>;
  11. /// Timer provides message scheduling, e.g. `ctx.schedule_once`
  12. type Tmr: TimerFactory<Msg = Self::Msg>;
  13. /// Event store provides the storage system for events/messages
  14. type Evs: EventStore<Msg=Self::Msg>;
  15. type Tcp: IoManagerProps<Msg = Self::Msg>;
  16. type Udp: IoManagerProps<Msg = Self::Msg>;
  17. }

模型特征由用于定制Riker系统的各种特征类型组成,包括消息类型。

默认模型

riker-default crate提供了一个默认模型,它使用默认的Riker模块,但仍允许您指定消息类型(协议)。

使用默认模型:

  1. extern crate riker;
  2. extern crate riker_default;
  3. use riker::actors::*;
  4. use riker_default::DefaultModel;
  5. // Get a default model with String as the message type
  6. let model: DefaultModel<String> = DefaultModel::new();
  7. let sys = ActorSystem::new(&model).unwrap();

默认模型有助于启动应用程序的初始阶段。 它也是集成测试的不错选择。 当您准备好使用其他模块时,例如特定数据库的事件存储模块,您可以使用自己的模型。

自定义模型

由于Model是一个特征,它可以在一个简单的结构上实现。

让我们看看如何创建模型来更改事件存储和日志记录模块:

  1. extern crate riker;
  2. extern crate riker_default;
  3. use riker::actors::*;
  4. use riker_default::*; // <-- we're still going to use some default modules
  5. struct MyModel;
  6. impl Model for MyModel {
  7. type Msg = String;
  8. type Dis = ThreadPoolDispatcher;
  9. type Ded = DeadLettersActor<Self::Msg>;
  10. type Tmr = BasicTimer<Self::Msg>;
  11. type Evs = Redis<Self::Msg>; // <-- a module to provide Redis storage
  12. type Tcp = TcpManager<Self::Msg>;
  13. type Udp = TcpManager<Self::Msg>;
  14. type Log = MyLogger<Self::Msg>; // <-- our own Log module
  15. }
  16. let sys = ActorSystem::new(&MyModel).unwrap();