问题背景

与数据库或者存储系统交互是所有应用软件都必不可少的功能之一,akka开发的系统也不例外。但akka特殊的地方在于,会尽可能的将所有的功能都设计成异步的,以避免Actor阻塞,然而无法避免IO这类的阻塞操作。我们往往会把IO消息发送给单独的Actor进行处理,避免业务主逻辑受到阻塞。

在处理IO消息时,有两种模式:批量和单条。批量是指一次性处理多个消息,这样可以减少与存储系统的交互,提高吞吐量,适合处理大量消息;单条是指一次只处理一条消息,与存储系统交互次数增多,但可以尽快的处理当前消息,这在消息比较少时非常有用。

但系统往往是复杂的,待处理的消息的分布并不集中,业务繁忙时,短时间内消息很多,此时批量处理可以增加吞吐量;业务闲暇时,消息零零散散,需要尽可能快的处理消息。一个优秀的系统需要能够识别并合适的处理这两种消息速率,用akka开发系统时,也需要拥有这种能力。

问题假设

记得以前数学老师讲课时,最喜欢也是最经常说的两个字就是“解、设”,就是在解决问题之前,总是会做一些假设。那么我们也做一些假设,以简化解决问题的难度,但这并不影响我们对原有问题的理解。现假设如下:

有一个actor接收其他actor发过来的消息,把它存入数据库:
1、数据量比较少时。数据单条处理,尽量快速的入库。

2、数据量比较大时。数据需要批量处理,比如调用jdbc的batch操作,以提高吞吐量。

3、需要能够在不同消息速率之间自由切换。

基于以上的背景,这个actor该如何设计比较好呢?

解决思路

解决该问题有以下几点因素需要考虑:

如何计算消息速率。

如何判断消息速率过高或过低

批量、单条模式之间如何切换

基于akka解决问题(毕竟作者遇到这个问题就是在用akka开发软件的过程中)

计算消息速率

上面问题的关键点之一是如何判断当前的消息速率过高或过快,而计算速率的重要参数是时间,而在分布式场景下时间是一个不可忽视的因素。各个节点之间的时间有时无法做到完全一致,作者所在的公司就是这样。
计算时,时间有两种选择方式:

1、选择消息本身的时间;
2、选择处理消息时,当前系统时间。

两种选择方式各有优劣。第一种比较准确,毕竟计算速率的对象是消息,用消息的时间也最为准确,但这要求所有节点的时间保持同步,而且消息本身必须有一个时间字段;第二种准确度稍微差一点,毕竟收到消息与实际处理该消息会有一定的延时,可以处理任意类型的消息。
为了简化并解决问题,作者选择了消息本身的时间作为计算参数,所有的消息都有时间字段。

切换计算模式

我们已经计算出了消息速率,那么是否就可以直接跟设定的阈值进行对比,判断当前的处理模式(批量或单条)了呢?这还不一定,要根据实际情况作出判断。消息速率的计算有两种计算方式:实时、固定速率。其中“固定速率”也有两种方式:固定消息个数、固定处理间隔。

计算的方法各有千秋。如果实时计算消息速率,可以及时的切换批量或单条模式,但在速率不稳定的情况下,会造成“抖动”的情况,即频繁的在两种模式之间进行切换,很可能造成批量处理的消息数量过少,降低吞吐量;固定速率计算,则可以缓和这种“抖动”,当然也就不能及时的切换批量或单条模式。

同样,为了简化问题,并考虑遇到问题的实际情况,作者选择用“固定速率”计算消息速率,计算方法如下:

1、 刚开始处于单条模式,保存当前时间(或第一条消息的时间)为StartTime
2、 单条模式下处理消息,并保存消息的当前时间问EndTime

3、 计算当前的处理消息的个数,如果达到一个批量阈值,则计算此次批量时间跨度,即EndTime-StartTime。如果时间跨度大于批量时间的阈值,即此次批量处理的消息比较少,继续处于单条模式;如果时间跨度小于阈值,则表示在短时间内,收到了大量的消息,则切换为批量模式,计数器清零。

4、 批量模式开始时,保存第一条消息的时间为StartTime
5、 批量模式处理消息,并保存消息的当前时间问EndTime

6、 计算当前的处理消息的个数,如果达到一个批量阈值,则返回“批量提交”消息,该消息作为特殊消息,提示处理程序提交当前批量。
7、 通过外部actor或者外部系统,给当前actor发送“批量心跳”消息,该消息主要为了弥补消息尾端的空白。即消息个数少于一个批量时,能够及时处理当前剩余消息。

8、 收到“批量心跳”消息时,检查当前消息处理个数,如果小于一个批量阈值,则表示当前消息速率过低,退出批量模式;如果大于一个批量阈值,则计数器清零,保持批量模式。无论此时进入哪个模式,都会发送“批量提交”消息,以尽快提交当前批量。

demo代码

为了保持通用,此处设计了一个抽象类,封装了部分逻辑

TODO

demo代码还是有点简单,后期需要进一步的优化,例如该actor只能对某一类消息进行自动速率调整,无法适应多个不同类型消息的AutoDrive,欢迎大家进行讨论,提出各种优化方案。

本文摘自异步社区,发表人: gabry.wu ,作品《自动调整速率的Actor设计模式》未经授权,禁止转载。

推荐阅读

2018年5月新书书单(文末福利)

2018年4月新书书单

异步图书最全Python书单

一份程序员必备的算法书单

第一本Python神经网络编程图书

长按二维码,可以关注我们哟

每天与你分享IT好文。

在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程

点击阅读原文,查看更多内容

阅读原文

转载于:https://blog.51cto.com/13127751/2125524

自动调整速率的Actor设计模式相关推荐

  1. Actor模式理解与使用

    最近学习ThingsBoard,其中大量使用了Actor设计模式,再这里做个Actor模式理解与使用的笔记 Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share not ...

  2. 24分钟让AI跑起飞车类游戏

    本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...

  3. 手把手教你学Dapr - 7. Actors

    介绍 Actor模式将Actor描述为最低级别的"计算单元".换句话说,您在一个独立的单元(称为actor)中编写代码,该单元接收消息并一次处理一个消息,没有任何并发或线程. 再换 ...

  4. WLAN无线局域网IEEE802.11协议二

    2.1.3.无线管制 FCC批准了3个频段供公众使用,不需要许可,分别是900Mhz.2.4Ghz.5Mhz.其中900Mhz和2.4Ghz被称为ISM频段,5Ghz称为UNI频段.各国制造商使用这三 ...

  5. 水星UD6S网卡Linux驱动,水星UD6S无线usb网卡驱动程序下载-水星网络UD6S网卡驱动1.0 最新版-东坡下载...

    UD6S专业的无线usb网卡,在目前来说是很多的家庭以及办公室都是会使用到的,你可以通过官方的水星网络UD6S网卡驱动进行全方面的管理! 官方介绍 UD6S双频无线网卡适用于台式 PC 机.笔记本等设 ...

  6. 夜光带你走进通信网络(九) 新的领域

    夜光序言: 鹤立鸡群太久,会忘记外边都是凤凰,学无止境噢~~ 这让我想起Python语言~~ 正文:数字数据传输及DTE/DCE接口 信息处理设备如个人计算机(PC)能生成编码信号,通常还需要其它设备 ...

  7. 案例分享 | 24 分钟让 AI 跑起飞车类游戏

    文 / 腾讯 IEG 图灵实验室 李旭冬 导语:本文主要介绍如何用 TensorFlow 让 AI 在 24 分钟内学会玩飞车类游戏.我们使用 Distributed PPO 训练 AI,在短时间内可 ...

  8. 24 分钟让 AI 跑起飞车类游戏

    导语:本文主要介绍如何用 TensorFlow 让 AI 在 24 分钟内学会玩飞车类游戏.我们使用 Distributed PPO 训练 AI,在短时间内可以取得不错的训练效果. 本方法的特点: 纯 ...

  9. 厉害了,24分钟让AI跑起飞车类游戏

    来源|腾讯WeTest 编辑|布袋熊 导Lead语 谷歌用人工智能技术训练了AlphaGo机器人在围棋盘上打败了柯洁和李在石,阿里训练了千牛店小蜜为商家提供智能客服服务,百度用人工智能技术做出了Apo ...

最新文章

  1. 线段树 ---- 线段树维护线段相加+滑动变长窗口 2021牛客多校第7场 F xay loves trees
  2. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...
  3. 面试官上来就问:Java 进程中有哪些组件会占用内存?
  4. 高效率读写文件方法比较
  5. c++中sscanf的用法
  6. 使其正序排序 打印一串数字_JavaScript计数排序算法
  7. 前端学习(2752):global全局设置
  8. [Leetcode]@python 90. Subsets II.py
  9. 天池 在线编程 数组游戏
  10. 【LeetCode笔记】470. 用Rand7()实现Rand10()(Java、概率)
  11. python黑帽子学习
  12. 5G关键技术简介带你揭开5G神秘面纱
  13. 怎么做有内容的二维码?二维码在线制作教程
  14. 随身WiFi刷百度直连
  15. Linux 权限管理深剖
  16. 安装mingw-w64失败解决方法
  17. 区块链技术在软件开发中的应用
  18. Cocos 2.x 扩展开发教程
  19. Oracle因修改pga和sga超过memory限制size报错解决
  20. CAD杀毒V2.6 正式版

热门文章

  1. VR/AR会是微信后马化腾进军的战场吗
  2. .NET领域最为流行的IOC框架之一Autofac
  3. Socket笔记【转】
  4. 如何简化Exchange 2007 OWA URL访问
  5. 软件架构的相关概念小汇
  6. 四川大学研究生的一封公开信
  7. flutter打开android界面,在已有Android项目中使用Flutter
  8. 河北师范大学C语言试题,2017年河北师范大学信息技术学院838C语言程序设计考研题库...
  9. html css 表格自动高度,html – 表格单元格(IE)中的Textarea CSS {height:100%}
  10. mobaxterm 传文件夹_如何使用MobaXterm上传文件到远程Linux系统-MobaXterm使用教程