- 浏览: 2652430 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
原文:http://macrochen.iteye.com/blog/1608383
主要参考在这篇
文章, 写的非常好.
netty主要是一个异步的nio server/client framework
它采用了event driven模式
netty主要针对异步(asynchronous)请求的处理
netty channel可以理解为传输请求的另外一种抽象, 是netty最核心的概念, 它既可以表示一个socket, 也可以表示一个file, 总之就是I/O的一个抽象.
channel提供了一个网络连接和向目标对象写数据的接口, 而对于异步方式来说, 没有读的概念(通过listener来监听返回数据), Channel的返回结果会放在ChannelFuture中
netty不仅实现异步, 也有同步实现, 不过是内部也是采用的future机制
channel分server和client两种
channel由ChannelFactory创建, 它需要提供两个线程池: boss线程池, worker线程池, boss线程池用来监听连接, 将接受到的数据传给worker线程池处理, 一般只会有一个boss thread.
worker thread应该注意的一点是千万别被block和deadlock, 否则会导致整个吞吐量上不去. 尽量保证worker thread简单专一, 剥离无关内容, 能快速完成处理.
boss thread只有一个, 但是为什么要用thread pool?
1.可能有多个channel factory, 这些factory可以共用一个boss thread pool来创建boss thread.
2.boss thread可以中途进行释放, 为了避免重复create的开销, 可以用一个小型的thread pool来管理
所有资源的分配都是通过channel factory来完成, 因此如果需要释放资源, 需要调用realseExternalResources()
channel的使用三部曲:
- 创建
- 监听socket
- 调用write(Object message)接受数据. 不过这里只能接受ChannelBuffer类型的数据.
这里需要提到Channel另外一个组成部分, ChannelPipeline.
它主要完成对传入的内容的解析处理.为了保证这个解析的灵活性, 或包含一系列的, 各种类型的解析器,
这些解析器最后将以ChannelHandler的方式进行组织. ChannelPipeline则包含多种ChannelHandler,
一般第一个ChannelHandler接受ChannelBuffer,
最后一个ChannelHandler(通常命名为sink)用来去掉payload信息. ChannelHandler是一个标志接口,
灵活性非常强, 它一般会通过接受ChannelEvent(内含ChannelBuffer)来完成对数据的处理.
ChannelHandler主要包含两类: Encoder(将数据流转换成ChannelBuffer), Decoder
除了编解码之外, 还有一些其他类型的channelHandler, 比如将channel event丢到thread
pool中处理的ExecutionHandler, 用于同步处理的BlockingReadHandler,
用于打日志的LoggingHandler
client bootstrap 是connect, server bootstrap是bind
如果让client传上来的channelbuffer经过处理之后, 再原路返回一些消息给client, 在ChannelHandler中一般这样写:
Channel channel = e.getChannel(); ChannelFuture channelFuture = Channels.future(e.getChannel()); ChannelEvent responseEvent = new DownstreamMessageEvent(channel, channelFuture, newDate, channel.getRemoteAddress()); ctx.sendDownstream(responseEvent); // But still send it upstream because there might be another handler super.messageReceived(ctx, e);
这里返回数据需要注意两点, 一个是可能返回的handler之后还有handler, 我们还需要继续将修改后的内容继续往后传递, 另外一个就是返回的数据可能不希望再被其中的某些handler处理.
handler可以分为upstream handler(channel pipeline向外面发数据), downstream
handler(外面向channel pipeline发数据)和 both handler. 我觉得这个up, down名字取得不好,
应该是out=up, in=down, 不过如果将channel pipeline想象成一个口袋, 可能更好理解. 或者理解成: read
up, write down
pipeline中的handler可以动态调整, 比如下面的这个, 就是根据传入的内容的大小来决定是否需要使用压缩handler来进行压缩处理
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) { // If the message is not a ChannelBuffer, hello ClassCastException ! ChannelBuffer cb = (ChannelBuffer)e.getMessage(); // Check to see if we already removed the handler boolean pipelineContainsCompressor = ctx.getPipeline().getContext(nameOfCompressionHandler)!=null; if(cb.readableBytes() < sizeThreshold) { if(pipelineContainsCompressor) { // The payload is too small to be compressed but the pipeline contains the compression handler // so we need to remove it. compressionHandler = ctx.getPipeline().remove(nameOfCompressionHandler); } } else { // We want to compress the payload, let's make sure the compressor is there if(!pipelineContainsCompressor) { // Oops, it's not there, so lets put it in ctx.getPipeline().addAfter(ctx.getName(), nameOfCompressionHandler , compressionHandler); } } }
ChannelHandlerContext可以看成handler和pipeline之间的adapter. 用来方便在handler处理过程中调用pipeline
对于ObjectEncoder是无状态的, 而ObjectDecoder是有状态的. 之所有有状态是因为解码的过程中需要的ChannelBuffer是不连续的, 可能需要多次解码才能得到最终完成的对象, 而在处理的过程中需要保存一些状态信息.
如果连接数小于1000, netty推荐采用传统的OIO(blocking)模式
ChannelLocal提供了一种类似ThreadLocal的机制在一个Channel中访问共享的内容.
发表评论
-
Netty笔记ReplayingDecoder
2013-03-15 11:39 1313为什么需要ReplayingDecoder,它和FrameD ... -
netty StringDecoderTester
2013-02-21 16:55 1030netty package com.duita ... -
netty文档集合
2013-02-10 13:17 1112Netty 3.1 中文用户手册(一)-序言 Netty ... -
TransferQueue
2013-02-08 14:55 1595在看netty的代码实现发 ... -
ChannelBuffer介绍介绍
2012-11-07 11:28 837A random and sequential ... -
FrameDecoder介绍
2012-11-05 18:26 1206FrameDecoder 负责 decodes ... -
netty简单介绍
2012-11-03 20:05 1170ServerBootstrap 启动nett ... -
Netty服务器线程模型概览
2012-10-08 16:57 10876一切从ServerBootstrap开始 ServerB ... -
netty源代码分析
2012-10-08 16:35 963这篇文章(http://san-yun.iteye.com/b ... -
netty ExecutionHandler
2012-10-08 16:34 1525前面(http://san-yun.iteye.com/blo ... -
netty ChannelFuture
2012-10-08 14:12 1336在Netty中所有的io操作都是异步的,这也就是意味任何io访 ... -
Netty实现原理浅析
2012-09-29 15:47 1352Netty是JBoss出品的高效的Java NIO开发框架, ... -
Netty代码分析
2012-09-29 13:22 771参考:http://rdc.taobao.co ... -
netty初探
2011-05-24 15:56 1615netty API //启动类 Server ...
相关推荐
在本篇Netty4.0学习笔记中,我们将聚焦于如何在实际应用中混合使用`coder`和`handler`,这是Netty框架中非常关键的一部分,对于构建高性能、低延迟的网络应用程序至关重要。Netty是一个用Java编写的异步事件驱动的...
Netty基础,用于学习Netty,参考黑马程序员的netty教程
在本篇Netty4.0学习笔记系列之六中,我们将深入探讨Netty框架如何支持多种通讯协议,以及它在实现高效、灵活的网络通信中的关键特性。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的...
在本篇“Netty4.0学习笔记系列之五:自定义通讯协议”中,我们将深入探讨如何在Netty框架下构建和实现自己的通信协议。Netty是一个高性能、异步事件驱动的网络应用框架,广泛应用于Java领域的服务器开发,如网络游戏...
在本篇“Netty4.0学习笔记系列之二:Handler的执行顺序”中,我们将深入探讨Netty中的Handler处理链以及它们的执行流程。 首先,Netty 中的 ChannelHandler 是处理 I/O 事件或拦截 I/O 操作的核心组件。每个 ...
Netty4.0学习笔记系列之三是关于构建简单的HTTP服务的教程,这主要涉及网络编程、服务器开发以及Java NIO(非阻塞I/O)的相关知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,它使得开发可伸缩且稳定的...
这篇全面的学习笔记主要围绕 Netty 的运行环境、架构、网络模型(Reactor 模式)以及处理模型(Pipeline 模式)进行详细讲解。 1. **运行环境** 在学习 Netty 时,使用的版本是 Netty-3.2.5.Final,兼容 JDK 1.6。...
二、Netty 学习笔记 学习笔记通常包含了作者在学习过程中的总结和实践经验,对于初学者来说极具参考价值。笔记可能涵盖 Netty 的安装配置、基本使用、线程模型、缓冲区操作、编解码器的实现以及异常处理等方面,帮助...
在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...
### Netty学习笔记知识点概述 #### 一、Netty简介 Netty是一个广泛使用的高性能、异步事件驱动的网络应用程序框架,它简化了网络编程的复杂性,使得开发者能够更轻松地开发高性能、高可靠性的网络服务器和客户端。...
Netty学习笔记_Springboot实现自定义协议 本文主要介绍了使用Netty框架在Springboot项目中实现自定义协议的方法。自定义协议是指在网络通信中,使用特定的数据格式来传输数据,以满足特定的业务需求。在本文中,...
这个“netty官网学习手册中文版”针对的是Netty的3.1版本,虽然现在的Netty已经发展到了5.x版本,但3.1版本的知识仍然具有历史参考价值,特别是对于那些初次接触或需要理解Netty基础概念的开发者来说。 1. **Netty...
本篇阅读笔记主要围绕Netty的核心组件和原理进行详细分析。 首先,ChannelBuffer是Netty中用于网络数据交换的字节容器。在Netty中,所有的网络数据都是通过ChannelBuffer进行读写的。它的作用类似于Java NIO中的...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写,用于简化高效网络服务的构建。Netty 提供了丰富的组件和设计模式,如责任链模式的编码和解码功能,用于处理各种信息格式,如Protocol ...
在Netty网络框架学习笔记-1中,可能详细介绍了NIO的基本概念,如选择器(Selector)、通道(Channel)和缓冲区(Buffer),以及它们如何协同工作以提高并发处理能力。 2. **Netty入门**:笔记-3和-5探讨了Netty的入门知识...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Web开发中,Netty常被用来构建高效的服务端通信系统,尤其在处理大量并发连接时,其优势更为明显。 在文档...
在深入探讨 Netty 的实践学习案例之前,我们先了解一下 Netty 的核心特性: 1. **异步非阻塞 I/O**:Netty 基于 Java NIO(非阻塞I/O)构建,允许它处理大量并发连接,减少了线程创建和上下文切换的开销。 2. **零...
《基于Netty网络编程项目...通过阅读这份笔记,开发者不仅可以深入理解Netty的内部工作原理,还能学习到如何在项目中有效运用Netty,提升网络编程的效率和质量。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
读书笔记:Netty权威指南 笔记Note of The Definitive Guide