什么是ACTOR 并发模型
Actor 是一种处理并发计算的基本模型,主要概念是通过OO 面向对象思想,将计算单元独立成一个对象,在模型中成为Actor,各个独立计算单元之间的通信通过mailbox(邮箱),每个Actor维护自己的mailbox,ma
ilbox存储的是需要消费的消息。这里扩散一下知识,在更早期出现的ESB(enterprise service bus)企业服务总线模型是将服务接到消息总线上,服务获取总线上投递给他的消息。
这种方式存在耦合,以及需要一个个服务进行确认,直到消费者进行确认消费,好处是实现简便,接入现在的消息中间件就行。
以下为Actor模型的组件图:
Actor的思想早在1973年就提出,最早在erlang中实现,应用于电信系统,可以想象下,每个通话内容质量互不影响,每分每秒有多少人在通话。
在Erlang中,每段代码都运行在进程中,进程是Erlang中对Actor的称呼,意味着它的状态不会影响其他进程。系统中会有一个supervisor,实际上它只是另一个进程。被监控的进程挂掉了,supervisor会被通知并对此进行处理,因此也就能创建一个具有自愈功能的系统。如果一个Actor到达异常状态并且崩溃,无论如何,supervisor都可以做出反应并尝试把它变成一致状态,最常见的方式就是根据初始状态重启Actor。
Actor模型不关乎任何语言,只在于思想。
在Java领域的框架有 Scala实现的 Akka、C++ 实现的有:CAF,我自己实现的actor系统是借鉴于skynet.
今天主要介绍CAF
CAF c++版的 Actor 模型开发框架
CAF的源码仓库
https://github.com/actor-framework/actor-framework
c++ actor framework 并没有被boost收入,而是自己独立发展。
先简要介绍我自己的实现版本:
-
场景:
actor数量固定(强场景),比如整个处理系统的计算单元独立分工,类微服务(进程内)
-
实现方式:
a、每个actor自己维护消息队列
b、actor间通过依赖反转实现消息投递
c、actor系统(主线程),监听到有需要线程的actor之后,从线程池分配线程给actor进行处理,每个acotr随机处理消息数量,防止消息过多从而线程独占。
CAF中的Actor
class TestActor : public event_based_actor {
public:
TestActor(actor_config& cfg) : event_based_actor(cfg) {
// nop
}
behavior make_behavior() override {
return {
[](int x, int y) {
return x + y;
},
[](double x, double y) {
return x + y;
}
};
}
};
重写了make_behavior的类就是一个类类型的actor。
可以在make_behavior中实现我们的计算逻辑。
actor间通信
caf框架出了进程内actor通信外,还支持进程间通信,这就比我只需在进程内通信的需求大得多了, 先讲进程内通信方式
进程内
behavior adder() {
return {
[](int x, int y) {
return x + y;
},
[](double x, double y) {
return x