美文网首页Akka
Akka 2.5.11 I/O

Akka 2.5.11 I/O

作者: mango_knight | 来源:发表于2018-04-11 11:22 被阅读0次

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提供了额外的特性。

相关文章

  • Akka 2.5.11 I/O

    akka.io包是结合spray-io模型开发的。 I/O 为了达到极端的可伸缩性,必须有一个可以正确匹配的底层传...

  • Akka 2.5.11 路由 Routing

    当处理到来的消息流时,我们需要一个actor来引导消息路由到目标actor,从而提高消息的分配效率。在Akka中这...

  • Akka 2.5.12 Using TCP

    本部分内容都需要引用: 所有的 Akka I/O API都需要通过manager访问,当使用 I/O API时,第...

  • Akka 2.5.12 I/O 层设计

    需求 数百万条并发连接的可伸缩性 从输入通道获取数据到目标actor的邮箱,这个过程中的最低延迟 最大的吞吐量 可...

  • Akka 2.5.11 分布式发布订阅

    Distributed Publish Subscribe in Cluster 通过了解Akka集群后,我们可能...

  • Akka 2.5.11 持久化 Persistence 中文文档

    持久化 当我们在集群系统中,一台机器向另一台机器发送一段数据,负责接收的机器在接收数据前突然宕机,就会造成数据丢失...

  • Akka 2.5.11 Cluster Client 集群客户端

    ClusterClient是一个集群客户端,主要用于集群外部系统与集群通信,只需要知道一个集群中的节点作为初始的联...

  • 。o゜。゜O。°゜O。°o°o゜o。O

    信仰……゜o。[!+!=I我]。!+!=I我]。!+!=I我]。!+!=I我]。°o°o゜o。[!+!=I我]。!...

  • 2021-04-19

    信仰……゜o。[!+!=I我]。!+!=I我]。!+!=I我]。!+!=I我]。°o°o゜o。[!+!=I我]。!...

  • Linux I/O模型的前世今生

    Linux I/O模型 阻塞式I/O模型 非阻塞式I/O模型 I/O复用式模型 信号驱动式I/O模型 异步I/O模...

网友评论

    本文标题:Akka 2.5.11 I/O

    本文链接:https://www.haomeiwen.com/subject/vllnhftx.html