Dapr - actors之构建块(总)
After the state is updated, the method checks if the vehicle was driving too fast. If it was, the actor publishes a message to the pub/sub topic:RegisterExitAsync
collectfine
状态更新后, RegisterExitAsync
方法将检查车辆是否驾驶速度过快。 如果是,则Actor 将消息发布到 pub/sub 主题collectfine
:
C#
int violation = _speedingViolationCalculator.DetermineSpeedingViolationInKmh(
vehicleState.EntryTimestamp, vehicleState.ExitTimestamp);
if (violation > 0)
{
var speedingViolation = new SpeedingViolation
{
VehicleId = msg.LicenseNumber,
RoadId = _roadId,
ViolationInKmh = violation,
Timestamp = msg.Timestamp
};
await _daprClient.PublishEventAsync("pubsub", "collectfine", speedingViolation);
}
The code above uses two external dependencies. The encapsulates the business logic for determining whether or not a vehicle has driven too fast. The allows the actor to publish messages using the Dapr pub/sub building block._speedingViolationCalculator
_daprClient
上面的代码使用两个外部依赖项。 封装用于确定车辆是否驾驶速度过快 _speedingViolationCalculator
的业务逻辑。 允许 actor 使用 Dapr pub/sub 构建基块发布消息。
Both dependencies are registered in the class and injected into the actor using constructor dependency injection:Startup
这两个依赖项在 类 Startup
中注册,并且使用构造函数依赖项注入注入到Actor中:
C#
private readonly DaprClient _daprClient;
private readonly ISpeedingViolationCalculator _speedingViolationCalculator;
private readonly string _roadId;
public VehicleActor(
ActorHost host, DaprClient daprClient,
ISpeedingViolationCalculator speedingViolationCalculator)
: base(host)
{
_daprClient = daprClient;
_speedingViolationCalculator = speedingViolationCalculator;
_roadId = _speedingViolationCalculator.GetRoadId();
}
The actor based implementation no longer uses the Dapr state management building block directly. Instead, the state is automatically persisted after each operation is executed.
基于Actor 的实现不再直接使用 Dapr 状态管理构建基块。 而是在执行每个操作后自动保留状态。
Summary
总结
The Dapr actors building block makes it easier to write correct concurrent systems. Actors are small units of state and logic. They use a turn-based access model which saves you from having to use locking mechanisms to write thread-safe code. Actors are created implicitly and are silently unloaded from memory when no operations are performed. Any state stored in the actor is automatically persisted and loaded when the actor is reactivated. Actor model implementations are typically created for a specific language or platform. With the Dapr actors building block however, you can leverage the actor model from any language or platform.
Dapr actors 构建基块可以更轻松地编写正确的并发系统。 actors 是状态和逻辑的小单元。 它们使用基于轮次的访问模型,无需使用锁定机制编写线程安全代码。 actors 是隐式创建的,在未执行任何操作时以无提示方式从内存中卸载。 重新激活actors 时,自动持久保存并加载actors 中存储的任何状态。 actors 模型实现通常是为特定语言或平台创建的。 但是,借助 Dapr 执行组件构建基块,可以从任何语言或平台利用执行actors 模型。
Actors support timers and reminders to schedule future work. Timers do not reset the idle timer and will allow the actor to be deactivated when no other operations are performed. Reminders do reset the idle timer and are also persisted automatically. Both timers and reminders respect the turn-based access model, making sure that no other operations can execute while the timer/reminder events are handled.
Actor 支持计时器和提醒来调度将来的工作。 计时器不会重置空闲计时器,并且允许Actor 在未执行其他操作时停用。 提醒会重置空闲计时器,并且也会自动保留。 计时器和提醒都遵守基于轮次的访问模型,确保在处理计时器/提醒事件时无法执行任何其他操作。
Actor state is persisted using the Dapr state management building block. Any state store that supports multi-item transactions can be used to store actor state.
使用 Dapr 状态管理构建基块 持久保存执行组件状态。 支持多项事务的任何状态存储都可用于存储执行组件状态。
- 点赞
- 收藏
- 关注作者
评论(0)