《阿里巴巴Android开发手册(规约)》,负责按顺序处理 Channel 中的事件

摘要近日,苹果开源了一款基于事件驱动的高性能跨平台网络应用程序开发框架
SwfitNIO,它有点类似 Netty,但开发语言使用的是
Swift。1、SwiftNIO是什么SwfitNIO
实际上是一个底层工具,用于开发高性能的网络应用程序,作为“每连接一个线程”的替代方案。为了提升性能,SwfitNIO
使用了非阻塞 IO,这从它的名字就可以看出来。非阻塞 IO 与阻塞式 IO
非常不一样,因为不管是往网络上发送数据还是从网络上接收数据,应用程序都无需等待,系统内核会在有可操作的
IO 时通知 SwfitNIO。SwfitNIO 并不会提供类似 Web
框架那样的解决方案,而是致力于为上层框架提供底层的构建块。在开发 Web
应用程序时,大部分开发者不会直接使用 SwfitNIO,他们会从 Swift
生态系统众多的 Web 框架中选择一个。不过,这些框架中的大部分都使用了
SwfitNIO。2、受支持的平台SwfitNIO 的目标是支持所有可以运行 Swift
的平台。目前,SwfitNIO 可以在 macOS 和 Linux 上运行,包括:Ubuntu
14.04+macOS 10.12+3、基本架构SwfitNIO 包含了几种基本构建块,所有的
SwfitNIO
应用程序都是由这几种组件组成的。EventLoopGroupEventLoopChannelChannelHandlerBootstrapByteBuffer▶
EventLoopPromise 和 EventLoopFutureEventLoop 是 SwfitNIO 最基本的 IO
原语,它等待事件的发生,在发生事件时触发某种回调操作。在大部分 SwfitNIO
应用程序中,EventLoop 对象的数量并不多,通常每个 CPU 核数对应一到两个
EventLoop 对象。一般来说,EventLoop
会在应用程序的整个生命周期中存在,进行无限的事件分发。EventLoop
可以组合成 EventLoopGroup,EventLoopGroup 提供了一种机制用于在各个
EventLoop 间分发工作负载。例如,服务器在监听外部连接时,用于监听连接的
socket 会被注册到一个 EventLoop 上。但我们不希望这个 EventLoop
承担所有的连接负载,那么就可以通过 EventLoopGroup 在多个 EventLoop
间分摊连接负载。目前,SwiftNIO 提供了一个 EventLoopGroup
实现(MultiThreadedEventLoopGroup)和两个 EventLoop
实现(SelectableEventLoop 和
EmbeddedEventLoop)。MultiThreadedEventLoopGroup 会创建多个线程(使用
POSIX 的 pthreads 库),并为每个线程分配一个 SelectableEventLoop
对象。SelectableEventLoop 使用选择器(基于 kqueue 或
epoll)来管理来自文件和网络 IO 事件。EmbeddedEventLoop 是一个空的
EventLoop,什么事也不做,主要用于测试。▶
Channels、ChannelHandler、ChannelPipeline 和 ChannelHandlerContext尽管
EventLoop
非常重要,但大部分开发者并不会与它有太多的交互,最多就是用它创建
EventLoopPromise 和调度作业。开发者经常用到的是 Channel 和
ChannelHandler。每个文件描述符对应一个 Channel,Channel
负责管理文件描述符的生命周期,并处理发生在文件描述符上的事件:每当
EventLoop 检测到一个与相应的文件描述符相关的事件,就会通知
Channel。ChannelPipeline 由一系列 ChannelHandler 组成,ChannelHandler
负责按顺序处理 Channel 中的事件。ChannelPipeline
就像数据处理管道一样,所以才有了这个名字。ChannelHandler 要么是
Inbound,要么是 Outbound,要么两者兼有。Inbound 的 ChannelHandler
负责处理“inbound”事件,例如从 socket 读取数据、关闭 socket
或者其他由远程发起的事件。Outbound 的 ChannelHandler
负责处理“outbound”事件,例如写数据、发起连接以及关闭本地
socket。ChannelHandler
按照一定顺序处理事件,例如,读取事件从管道的前面传到后面,而写入事件则从管道的后面传到前面。每个
ChannelHandler 都会在处理完一个事件后生成一个新的事件给下一个
ChannelHandler。ChannelHandler
是高度可重用的组件,所以尽可能设计得轻量级,每个 ChannelHandler
只处理一种数据转换,这样就可以灵活组合各种
ChannelHandler,提升代码的可重用性和封装性。我们可以通过
ChannelHandlerContext 来跟踪 ChannelHandler 在 ChannelPipeline
中的位置。ChannelHandlerContext 包含了当前 ChannelHandler
到上一个和下一个 ChannelHandler 的引用,因此,在任何时候,只要
ChannelHandler 还在管道当中,就能触发新事件。SwiftNIO 内置了多种
ChannelHandler,包括 HTTP 解析器。另外,SwiftNIO 还提供了一些 Channel
实现,比如 ServerSocketChannel(用于接收连接)、SocketChannel(用于 TCP
连接)、DatagramChannel(用于 UDP socket)和
EmbeddedChannel(用于测试)。▶ BootstrapSwiftNIO 提供了一些 Bootstrap
对象,用于简化 Channel 的创建。有些 Bootstrap
对象还提供了其他的一些功能,比如支持 Happy Eyeballs。目前 SwiftNIO
提供了三种 Bootstrap:ServerBootstrap(用于监听
Channel),ClientBootstrap(用于 TCP Channel)和 DatagramBootstrap(用于
UDP Channel)。▶ ByteBufferSwiftNIO 提供了 ByteBuffer,一种快速的
Copy-On-Write 字节缓冲器,是大部分 SwiftNIO
应用程序的关键构建块。ByteBuffer
提供了很多有用的特性以及一些“钩子”,通过这些钩子,我们可以在“unsafe”的模式下使用
ByteBuffer。这种方式可以获得更好的性能,代价是应用程序有可能出现内存问题。在一般情况下,还是建议在安全模式下使用
ByteBuffer。▶ EventLoopPromise 和
EventLoopFuture并发代码和同步代码之间最主要的区别在于并非所有的动作都能够立即完成。例如,在向一个
Channel 写入数据时,EventLoop
有可能不会立即将数据冲刷到网络上。为此,SwiftNIO 提供了
EventLoopPromise和
EventLoopFuture,用于管理异步操作。EventLoopFuture实际上是一个容器,用于存放函数在未来某个时刻的返回值。每个
EventLoopFuture对象都有一个对应的
EventLoopPromise,用于存放实际的结果。只要 EventLoopPromise
执行成功,EventLoopFuture 也就完成了。通过轮询的方式检查 EventLoopFuture
是否完成是一种非常低效的方式,所以 EventLoopFuture
被设计成可以接收回调函数。也就是说,在有结果的时候回调函数会被执行。EventLoopFuture负责处理调度工作,确保回调函数是在最初创建
EventLoopPromise 的那个 EventLoop
上执行,所以就没有必要再针对回调函数做任何同步操作。4、SwiftNIO
的设计哲学SwiftNIO
的目标是要成为强大的网络应用程序开发框架,但并不想为所有的层次抽象提供完美的解决方案。SwiftNIO
主要专注在基本的 IO
原语和底层的协议实现上,将其他层次的抽象留给广大的社区去构建。SwiftNIO
将成为服务器端应用程序的构建块,但不一定就是应用程序直接拿来使用的框架。对性能有很高要求的应用程序可能会直接使用
SwiftNIO,减少上层抽象所带来的开销。SwiftNIO
可以帮助这些应用程序在提升性能的同时降低维护成本。SwiftNIO
还为某些场景提供了有用的抽象,高性能的网络服务器可以直接使用这些抽象。SwiftNIO
的核心仓库提供了一些非常重要的协议实现,比如
HTTP。不过,我们认为,大部分协议的实现应该要与底层的网络栈分开,因为它们的发布节奏是很不一样的。为此,我们鼓励社区自己去实现和维护他们的协议实现。实际上,SwiftNIO
提供的一些协议实现最初就是由社区开发的,比如 TLS 和
HTTP/2。5、相关资源源码托管:
文档:
SwiftNIO:聊天客户端:
客户端:
服务器端:
服务器:

摘要阿里巴巴于近日为广大程序员再送上重磅开春好礼:《阿里巴巴Android开发手册(规约)》。该开发规范在阿里内部经过了长期的修缮,现已总结成册,向所有移动开发者、技术爱好者开放,希望帮助开发者码出高效、码出质量
…1、前言阿里巴巴于近日为广大程序员再送上重磅开春好礼:《阿里巴巴Android开发手册(规约)》。该开发规范在阿里内部经过了长期的修缮,现已总结成册,向所有移动开发者、技术爱好者开放,希望帮助开发者码出高效、码出质量,提升系统的质量、协作的高效性。下载方式:重磅发布:《阿里巴巴Android开发手册(规约)》[附件下载]2、致谢贡献者《阿里巴巴Android开发手册》项目组成员,排名不分先后:芸墨(淘宝技术部)、矢亮(智能场景事业部)、游僧(淘宝技术部)、景宝(淘宝技术部)、邻云(闲鱼技术部)、尚节(猫客技术部)等。还有很多阿里巴巴移动端工程师参与,在此一并表示感谢,感谢孤尽(《阿里巴巴Java开发手册》主要作者)对手册的指导。3、这本手册(规约)有什么价值?2017年天猫双11,成交额再创新高达到1682亿元,其中无线交易额占比90%;2017年12月,钉钉在诞生1075天后,注册用户突破1亿;而在同期,闲鱼用户也突破了2亿……面对如此大的用户量和流量,这些App依然可以做到“丝般顺滑”。在这背后,是阿里巴巴移动开发团队的不断探索和优化。久而久之,这些经验汇总成了一套完善的开发规范,指导工程师开发出体验好、性能优、稳定性佳、安全性高的App。本手册(规约)以开发者为中心视角分为Java语言规范(遵循《阿里巴巴Java开发手册(规约)》),Android资源文件命名与使用,Android基本组件,UI与布局,进程、线程与消息通信,文件与数据库,Bitmap、Drawable与动画,安全以及其他等九大部分。这是一个广义的编码规范,
一本随时可以查阅的技术参考,你在手册中可以找到很多的技术规范、最佳实践,避坑指南等,它是每一位优秀移动开发者手里的必备好书。4、本手册规约)有哪些亮点?根据约束力强弱,规约依次分为强制、推荐、参考三大类:【强制】:必须遵守,违反本约定或将会引起严重的后果;【推荐】:尽量遵守,长期遵守有助于系统稳定性和合作效率的提升;【参考】:充分理解,技术意识的引导,是个人学习、团队沟通、项目合作的方向。对于规范条目的延伸信息中,增加了规范的解释说明和代码示例,“正例”提倡什么样的编码和实现方式,“反例”说明需要提防的雷区,以及错误案例,让开发者透彻理解每一条规范内容。5、阿里技术大牛对手册如何评价?淘宝技术负责人南天:车同轨,书同文,《阿里巴巴Android开发手册》既是高效合作的基础,也是深度创新的开始。淘宝基础平台部负责人天施:写出简洁优雅、性能好、兼容性考虑全面的Android代码是一件不容易的事情,更是优秀Android架构师功底所在。淘宝资深技术专家玄黎:稳定、体验优的客户端来源于一行行健壮的代码,手册沉淀了阿里多年的端侧经验,可以帮助Android工程师少走弯路。一个优秀的工程师和一个普通工程师的区别,不是现在满天飞的架构图,他的功底就是体现在他写的每一行代码上。别人都说我们是码农,但我们知道,自己是个艺术家。也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美、质量的美。而代码规约其实就是一个对美的定义。6、《阿里巴巴Java开发手册(规约)》目录前言一、Java语言规范二、Android资源文件命名与使用三、Android基本组件四、UI与布局五、进程、线程与消息通信六、文件与数据库七、Bitmap、Drawable与动画八、安全九、其他附录-认证考试7、部分内容截预览

摘要LKImageKit
是一个来自腾讯的高性能iOS平台图片框架,包括了图片控件,图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。基本介绍LKImageKit
是一个高性能的图片框架,包括了图片控件,图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。该框架具有高度的扩展性。在此框架下,开发者可以自定义图片框架中的任何一个部分,比如:自定义图片显示逻辑、自定义缓存、自定义下载组件、自定义解码器、自定义图片处理算法等等。该组件旨在提供
iOS
平台上使用最简单,功能最强大的高性能图片解决方案。组件特性提供演示视频和
DEMODEMO中演示了如何在图片墙场景的数千张图片下,配合预加载、优先级控制、分级加载等技术,实现图片在快速滑动场景的高速下载和显示模块插件化可定制缓存、解码、加载、绘制等多个模块支持取消不再显示的图片迅速取消请求,节约内存占用支持优先级、优先级可动态调整通过对不同区域优先级的设置,使页面加载获得更好的体验支持预加载可以预先加载图片,预加载和图片正常显示会自动合并动图支持支持多图动态播放,包括正向播放、逆向播放、来回播放等雪碧图支持提供将雪碧图解码成序列帧的能力滤镜支持支持在图片显示前异步对图片进行滤镜处理渐进式加载支持图片边下载边显示多级加载支持多级请求,比如先加载小图再加载大图后台解码使用后台线程解码,提升页面流畅度请求合并相同类型的请求会被合并,不会导致重复的运算和下载并发数控制可以分别对加载、解码、处理等多个模块进行分别并发控制API调用顺序无关无需考虑
API 调用顺序,并不需要将 setURL
作为发送请求的接口加载有多快,有图有真相!开源地址详见:

相关文章