c#事件的发布-订阅模型_什么是事件驱动架构,什么时候应该使用它?

克雷格·戈登-佩恩@ beardy.digital

ccfc9719d3e4e8cb977f50509235e6d0.png

事件驱动的体系结构是一种软件体系结构范例,可促进事件的产生,检测,使用和响应。

如何实现事件驱动的体系结构,以及何时使用它?

事件驱动的体系结构与微服务齐头并进。 发生操作时,将创建一个事件,然后使用该事件在所有等待该事件发生的事件上做出决策。

服务不再绑定在一起,因为在发布订阅类型模型中,调用者不再同步调用被调用者。 相反,被呼叫者以最终一致的方式对事件进行操作。

因此,事件驱动的体系结构可以更可靠,因为它们不必立即对服务调用进行操作(允许服务在成功之前都能够失败),但是很难预测何时执行操作(对于 同样的原因)。

事件驱动架构的一个简单示例是Amazon。 如果您曾经在忙碌的时间(例如黑色星期五)在亚马逊购物,则可以订购商品,但之后只能发送电子邮件说明您订购的商品实际上无货。

892e63b387d0d888ebb790a798855a3c.png

如果您以事件驱动的体系结构来考虑此过程,则它可能以下列方式工作:

基于事件驱动的网络框架源码 首先看一下Server类,这个类就是整个框架的核心类,在这个类中只需要 s=new Server(8883,4); s->setUserConnectionCallback(onConnect); s->setUserMessageCallBack(onMessage); s->start(); 就可以启动一个4个线程在8883端口监听的完整的网络程序,其中的两个onXXX就是网络程序需要处理的业务 Server类中包括了有一个重要的类叫做Eventlooper这个类就是对epoll的封装,要用epoll_ctl注册到epoll上的fd又被封装为Channel类,当有数据到来需要操作时,channel中的几个函数指针就指向了需要回调的函数, 这里使用了boost库的function 其中的函数定义为: typedef boost::function EventCallBack; 在epoll返回的时候Eventlooper会遍历可以操作的所有channel,并调用其成员函数handleEvent,该函数会判断events,也就是EPOLLIN EPOLLPRI等,并更具相应的需要去调用处理函数。 这里的Channel并不直接使用而是做基类存在的,更直接的操作在Acceptor和TcpConnection中,其中的 Acceptor 对应了接受连接的socketfd,而TcpConnection则封装了socket的读写操作,在Server的构造函数中会创建一个Acceptor类,真正accept成功以后又会调用到Server的OnConnection函数中,这个函数会根据每个线程的负载将客服端连接的fd注册进相应线程的epoll(当然在单线程的情况下就只有一个epoll)。最后一个作为缓冲区的类charbuff,用链表将单个7KB的缓冲区穿在一起,当数据大于7kb的时候会自动将其释放,避免内存不足,如果数据的块数多余一块那么发送数据就会调用writev。至此整个框架的流程就都已经清楚了,一个简单的实现。 在此还要感谢一下linux多线程网络服务器编程的作者陈硕,CINF的实现部分就是参考其网络框架muduo来的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值