附录G Netty与NettyUtils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录G的内容都在本文呈现。
Netty是一个NIO客户端服务器框架,使得开发高性能、高可靠性的网络服务器和客户端程序变得快速且容易。它极大地简化
化了网络编程,如TCP和UDP套接字服务器。
“快速和容易”并不意味着应用程序会有难维护和性能低的问题。Netty是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验,比如FTP, SMTP, HTTP和多种多样的二进制和基于文本的传统协议。因此Netty在不降低开发效率、性能、稳定性、灵活性情况下,已经成功地找到了解决方法。
NettyUtils是Spark对Netty API的封装,在这里对其中的主要方法进行说明。有关Netty的更多内容请访问Netty官网http://netty.io/。
createThreadFactory
功能描述:创建线程工厂,此工厂生成的线程都使用给定的前缀名threadPoolPrefix + "-" +数字的格式命名。 public static ThreadFactory createThreadFactory(String threadPoolPrefix) {return new DefaultThreadFactory(threadPoolPrefix, true);}
createEventLoop
功能描述:根据参数IOMode,创建Netty的EventLoopGroup。 public static EventLoopGroup createEventLoop(IOMode mode, int numThreads, String threadPrefix) {ThreadFactory threadFactory = createThreadFactory(threadPrefix);switch (mode) {case NIO:return new NioEventLoopGroup(numThreads, threadFactory);case EPOLL:return new EpollEventLoopGroup(numThreads, threadFactory);default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
getClientChannelClass
功能描述:根据参数IOMode,返回正确的客户端SocketChannel。 public static Class<? extends Channel> getClientChannelClass(IOMode mode) {switch (mode) {case NIO:return NioSocketChannel.class;case EPOLL:return EpollSocketChannel.class;default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
getServerChannelClass
功能描述:根据参数IOMode,返回正确的服务端SocketChannel。 public static Class<? extends ServerChannel> getServerChannelClass(IOMode mode) {switch (mode) {case NIO:return NioServerSocketChannel.class;case EPOLL:return EpollServerSocketChannel.class;default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
createFrameDecoder
功能描述:创建一个LengthFieldBasedFrameDecoder。LengthFieldBasedFrameDecoder的5个参数分别代表frame的最大长度、长度字段的偏移量、长度字段的字节数、需要排除的长度字段的字节数、长度字段的初始长度。所以创建的LengthFieldBasedFrameDecoder的前8个字节代表frame的长度。LengthFieldBasedFrameDecoder通常会被设置到SocketChannel的管道中,在所有Decoder被调用之前调用。 public static TransportFrameDecoder createFrameDecoder() {return new TransportFrameDecoder();}
getRemoteAddress
功能描述:返回Channel的远端地址。 public static String getRemoteAddress(Channel channel) {if (channel != null && channel.remoteAddress() != null) {return channel.remoteAddress().toString();}return "<unknown remote>";}
createPooledByteBufAllocator
功能描述:创建一个汇集ByteBuf但对本地线程缓存禁用的分配器。为什么要对本地线程缓存禁用?因为ByteBuf都是由事件循环线程分配,所以线程本地缓存对于TransportClient是禁用的。但是ByteBuf的释放却是由Executor线程,而不是事件循环线程来完成。本地线程缓存经常会延迟ByteBuf的回收,导致巨大的内存消耗。 public static PooledByteBufAllocator createPooledByteBufAllocator(boolean allowDirectBufs,boolean allowCache,int numCores) {if (numCores == 0) {numCores = Runtime.getRuntime().availableProcessors();}return new PooledByteBufAllocator(allowDirectBufs && PlatformDependent.directBufferPreferred(),Math.min(getPrivateStaticField("DEFAULT_NUM_HEAP_ARENA"), numCores),Math.min(getPrivateStaticField("DEFAULT_NUM_DIRECT_ARENA"), allowDirectBufs ? numCores : 0),getPrivateStaticField("DEFAULT_PAGE_SIZE"),getPrivateStaticField("DEFAULT_MAX_ORDER"),allowCache ? getPrivateStaticField("DEFAULT_TINY_CACHE_SIZE") : 0,allowCache ? getPrivateStaticField("DEFAULT_SMALL_CACHE_SIZE") : 0,allowCache ? getPrivateStaticField("DEFAULT_NORMAL_CACHE_SIZE") : 0);}
getPrivateStaticField
功能描述:用于获得Netty的静态属性值。 private static int getPrivateStaticField(String name) {try {Field f = PooledByteBufAllocator.DEFAULT.getClass().getDeclaredField(name);f.setAccessible(true);return f.getInt(null);} catch (Exception e) {throw new RuntimeException(e);}}
关于《Spark内核设计的艺术 架构设计与实现》
经过近一年的准备,《Spark内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:相关文章:

grails日志系统的研究
对于grails的日志输出,我真的是给弄吐血了。开始以为很简单,后来发现grails封装log4j做的有点太多了,很多东西的封装理解了觉得还挺合理,但是不理解的话真是无比迷茫。对于是否有必要做这么多强制性约束,我保留意见...…

给老婆写个Python教程
作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 什么是code code就是一种语言,一种计算机能读懂的语言。计算机是一个傻逼,他理解不了默认两可的任何东西。比如…

SpringBoot的修改操作
今天学习SpringBoot 的 CRUD 操作,练习 修改操作 时,发生了如下的异常: [nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.InvalidDataAccessApiUsa…

【Qt】QImage、QPixmap、QBitmap和QPicture
简述 Qt 提供了四个用于处理图像数据的类: QImage、 QPixmap、 QBitmap和QPicture。QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap继承自QPixmap,用在位深为1(黑白图片)上。…

ASP.NET,IIS7.0 上传大视频文件报错
一、问题概述: 最近开发上传视频文件的功能。基本流程已经跑通了,可是上传30M以上的文件时就会报错。 二、资料海洋瞎扑腾 从网上查了一些资料,一般都是下面这种说法: 看着步骤倒是也不算繁琐,可是本人照着步骤做了却没…

【imx6】Unable to find the ncurses libraries的解决办法
问题描述 在执行make menuconfig时,报错: Unable to find the ncurses libraries… 解决方法 安装ncurses和ncursesw库 sudo apt-get insatll ncurses-dev sudo apt-get insatll ncursesw-dev 注意:ncursesw库是ncurses的升级版本&#…

Elasticsearch6.1.3 for CRUD
为什么80%的码农都做不了架构师?>>> 一、创建文档 [root AOS2 AutoTest01:/root]#curl -X PUT 9.1.6.140:9200/students/class1/1?pretty -d > { > "first_name": "changwei", > "last_name": "…

指纹锁就安全了?防火防盗还得防AI
整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 如何挑战百万年薪的人工智能 https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 近日,你应该看到了社交媒体上对于网站 ThisPersonDoesNotExist.com,生成无数不存在人脸的铺天…

迪杰斯特拉算法(C语言实现)
迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲。 #include "stdio.h"#include "stdlib.h"//用一个最大数表示顶点之间不相关#define MAX 999//设置顶点个数#define MAX_VERTEX_NUM 7//表示顶点之间不…

小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡
整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)昨晚,小米集团组织部下发正式文件,宣布了最新一轮组织架构调整,任命了崔宝秋为集团副总裁,集团技术委员会主席,并且在核心管理岗位上共任命了 14 …

【驱动】在内核源码中添加驱动程序
以wifi驱动(RTL8188EUS驱动)为例 添加源码 将源码rtl8188EUS添加到drivers/net/wireless/rtl818x/目录下 添加Kconfig 在drivers/net/wireless/rtl818x/rtl8188EUS添加Kconfig,内容如下: config RTL8188EUtristate "Realtek 8188E USB WiFi&qu…

怎么让wordpress用sqlite3 搭建轻量级博客系统
wordpress 默认是用mysql作为数据库支持,这个对个人站长来说还是有点麻烦了些。特别是如果以后网站备份迁移就有点事多了。 之前用django开发自己的博客感觉其实用sqlite3作为数据库插好,就是一个文件而已。备份网站,直接打包整个目录即可方便…

IBM蓝色基因/Q将采用NAND闪存存储
IBM将在计划中的高性能“怪兽”——蓝色基因/Q中采用NAND闪存存储。 这是一款采用水冷方式的高性能计算系统,IBM在近日的SC10大会上展示了其原型机的组件。 蓝色基因/Q将采用的闪存是来自SMART的XceedIOPS MLC NAND产品,它使用34nm制程工艺&…

全球超2万名开发者调研:Python 3渗透率至84%
编辑 | suiling 出品 | Python大本营(ID:pythonnews) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 在2018年秋季,Python软件基金会与JetBrains发起了年度Python…

【Qt】QWidget对样式表设置边框无效的解决方法
1、现象 在对QWidget使用样式表时无效 QWidget#MyWgt{border:1px solid gray; }2、原因 原因是QWidget只支持background、background-clip和background-origin属性。 3、解决方法 3.1 使用QFrame代替QWidget,QFrame继承自QWidget,并且带有框架属性 …

break continue
break 终止整个循环体,执行循环后的代码; continue 终止单次的循环,整个循环体还是会继续执行转载于:https://www.cnblogs.com/RonnieQin/p/8430783.html

CSSA email list
UCSD: cssamailman.ucsd.eduUChicago: cssalists.uchicago.edu 转载于:https://www.cnblogs.com/stoneresearch/archive/2010/11/30/4336484.html

LVS原理详解(3种工作方式8种调度算法)--老男孩
一、LVS原理详解(4种工作方式8种调度算法)集群简介集群就是一组独立的计算机,协同工作,对外提供服务。对客户端来说像是一台服务器提供服务。LVS在企业架构中的位置:以上的架构只是众多企业里面的一种而已。绿色的线就…

【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法
解决方法 设置最大尺寸为16777215,并且使能Qt::WindowMaximizeButtonHint(默认就是使能的,不执行也可以) const QSize MAIN_SIZE_MAX QSize(16777215, 16777215); this->setMaximumSize(MAIN_SIZE_MAX); this->setWindow…

“AI明星”地平线B轮融资6亿美元!
整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 2 月 27 日,人工智能芯片技术的 AI 创业企业地平线(Horizon Robotics)宣布&a…

C++深拷贝与浅拷贝
浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可…

【OpenCV】使用过的函数汇总
1、类 Mat:矩阵matrix,opencv2中主要用来封装图片数据 InputArray:输入参数 ,约等于Mat OutputArray:输出参数,约等于Mat Rect:表示矩形 2、函数 imread();//从文件中读取图片到Mat中 imwrit…

春招来袭!程序员如何拿下硅谷顶级公司200万年薪?
还记得那个在去年,用 6 天时间参加了 LinkedIn、Yelp、Apple、亚马逊、Facebook 和 Google 的面试,并拿下了 6 份 Offer 的“别人家的程序员”吗?之后,他又在这几份工作中进行了选择,一步步谈下了 30 万美元࿰…

wake_lock_timeout的使用方法【转】
本文转载自:http://blog.csdn.net/liuxd3000/article/details/44224849 今天有用到用ec43_GPIO的中断来唤醒系统,将系统从深度休眠中唤醒并保证系统wakup 一段时间用过了,方法如下,有同样使用的童鞋可以参考一下!1. …

函数05 - 零基础入门学习C语言36
第七章:函数05 让编程改变世界 Change the world by program 函数的嵌套调用 嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。 然而,C语言不能嵌套定义函数,但可以嵌套调用函数,…

【linux】可执行程序执行时报错-sh: ./mxc_v4l2_tvin.out: No such file or directory的解决方法
问题 在imx6开发板上执行 ./mxc_v4l2_tvin.out时报错: -sh: ./mxc_v4l2_tvin.out: No such file or directory 原因查找 1、路径问题:确定在当前目录下有该程序,没问题; 2、使用ls -l查看可以执行权限,没问题&…

展望2018:WebRTC大规模商用元年
历经6年长跑,WebRTC终于在去年迎来了1.0标准(candidate recommendation)的发布,而它也将成为2018年视频通信商业应用场景爆发的主要技术推动力。一站式WebRTC通信技术提供商Zealcomm公司创始人、CEO冯昶对WebRTC在国内外发展历程、…

暴雪游戏遭遇AI“实力”坑队友:四处游走,还不参与战斗
作者 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw “打游戏 AI 将完胜人类!?” 抱歉,这个 Flag 还是不…

linux/nginx 安全增强
这有一篇很好的文章. 评论中有好的补充 http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html转载于:https://www.cnblogs.com/pengxl/archive/2010/12/08/1900175.html

十年程序员的告诫:千万不要重写代码!
对重写代码说不。 作者 | Roman Luzgin 译者 | 苏本如 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 以下为译文: 重写代码消耗了12个月! 我们从头开始重写代码浪费的时间。 你能想象在软件行业,12个月的时…