Akka 2.5.11 I/O

akka.io包是结合spray-io模型开发的。

I/O 为了达到极端的可伸缩性,必须有一个可以正确匹配的底层传输机制,完全由事件驱动,并且是非阻塞和异步的。该模块提供了一些底层 TCP 以及套接字抽象,可以用于编写自定义的网络通信。从而提高了抽象的层次。
所有Akka I/O api都通过manager对象访问。当使用I/O API时,第一步是获取对合适的manager的引用,manager是处理底层I/O资源(选择器、通道)并为特定事件(如监听传入连接)实例化worker actor。

import akka.io.{ IO, Tcp }
import context.system // implicitly used by IO(Tcp)

val manager = IO(Tcp)//查找TCPmanager并返回它的AactorRef

当manager接收到 I/O 命令以后实例化worker actor,这些worker actor会将自己的在回复上述I/O命令的消息中展现出来。
例如,在manager向TCP manager发送一个Connect命令后,manager会创建一个actor来表示TCP连接,这个connection actor就是种worker actor,它会发送一个Connected消息来声明自己。然后所有与该TCP连接相关的操作都可以通过向这个connection actor发送消息来调用。

DeathWatch and Resource Management

I/O 的worker actor 负责接受命令并且发送事件(入站连接、传入字节或写入的确认)。通常需要一个与用户端对应的actor来listen这些事件。这些worker会监测他们对应的listener actor,如果listener停止,与其对应的worker actor 会释放自己掌握的所有资源。这种设计使得API更加稳健地避免资源泄露。
同样地,也有一个负责处理connection的user actor 监测 worker actor,如果worker actor 意外终止,会得到通知。

Write models (Ack, Nack)

I/O设备的最大吞吐量限制了写入的频率和大小。如果一个应用程序想要推动比设备能够处理更多的数据时,驱动程序必须缓冲字节,直到设备能够写入它们时。有了缓冲,可以处理短时间的密集写入——但没有缓冲区是无限的。为了避免压倒性的设备缓冲器akka提供了两种“流量控制”方式

  • Ack-based :当写入成功时,驱动程序会用Ack通知写入器。
  • Nack-based :当写入失败时,驱动程序会用Nack通知写入器。

当写入完成时,worker会将ack对象发送给写入器。这可以用来实现基于ack的流控制,只有当旧数据被确认才发送新数据。

如果写入(或任何其他命令)失败,则驱动程序会通知发送命令的actor。此消息还将通知编写失败的writer,作为该写入的nack。因为是异步的,失败的写入可能不是最近发送的,如果作者想要重新发送被删除的消息,需要保留一个等待消息的缓冲区。

注意:Ack/Nack只是两种流控制模式,用来表示写入成功/失败,但不是错误处理。即使所有的写入都被确认但也不能够保证数据不丢失。

ByteString

为了保持隔离,actor只需要跟不可变的对象进行联系。ByteString是不可变的字节容器。Akka的I/O系统使用它作为一个高效的、不可变的字节容器。用于JVM上的I/O,例如Array[Byte]ByteBuffer

ByteString是一个类似于rope-like的数据结构,它是不可变的,并且提供了快速的连接和切片操作(对I/O来说是完美的)。当两个ByteStrings串联在一起时,它们都存储在结果的ByteString中,而不是复制到新数组中。droptake这种操作返回ByteString且仍然引用初始的数组,只需改变可见的偏移量和长度。还需要特别注意确保内部数组不能被修改。每当一个潜在的不安全的数组被用来创建一个新的ByteString时,就会创建一个defensive副本。
如果你需要一个ByteString,它只会为它的内容提供必要的内存,那么使用compact方法来获得CompactByteString实例。
如果ByteString只表示原始数组的一部分,那么这将在该切片中复制所有字节。

ByteString继承了IndexedSeq的所有方法,它也有一些新的方法。要了解更多信息,请查阅akka.util.ByteString类和它在ScalaDoc中的对象。

ByteString也有自己的优化构建器和迭代器类ByteStringBuilderByteIterator提供了额外的特性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容