您的位置:首页 > 运维架构 > 网站架构

分布式架构学习之:023--Dubbo线程模型

2017-05-12 16:37 357 查看


线程模型

http://dubbo.io/User+Guide-zh.htm 用户指南>>线程模型

类似于数据库的连接池

(+) (#)




事件处理线程说明
如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。
如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
Dispatcher
all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
direct 所有消息都不派发到线程池,全部在IO线程上直接执行。
message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。

ThreadPool
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

配置如:

配置标签

<dubbo:provider/>

<dubbo:protocol/>

例:

<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />

<dubbo:protocol/>

(+) (#)

服务提供者协议配置:

配置类:com.alibaba.dubbo.config.ProtocolConfig

说明:如果需要支持多协议,可以声明多个<dubbo:protocol>标签,并在<dubbo:service>中通过protocol属性指定使用的协议。

标签属性对应URL参数类型是否必填缺省值作用描述兼容性
<dubbo:protocol>id string可选dubbo配置关联协议BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号。2.0.5以上版本
<dubbo:protocol>name<protocol>string必填dubbo性能调优协议名称2.0.5以上版本
<dubbo:protocol>port<port>int可选dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80 

如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。
服务发现服务端口2.0.5以上版本
<dubbo:protocol>host<host>string可选自动查找本机IP服务发现-服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,-建议不要配置,让Dubbo自动获取本机IP2.0.5以上版本
<dubbo:protocol>threadpoolthreadpoolstring可选fixed性能调优线程池类型,可选:fixed/cached2.0.5以上版本
<dubbo:protocol>threadsthreadsint可选100性能调优服务线程池大小(固定大小)2.0.5以上版本
<dubbo:protocol>iothreadsthreadsint可选cpu个数+1性能调优io线程池大小(固定大小)2.0.5以上版本
<dubbo:protocol>acceptsacceptsint可选0性能调优服务提供方最大可接受连接数2.0.5以上版本
<dubbo:protocol>payloadpayloadint可选88388608(=8M)性能调优请求及响应数据包大小限制,单位:字节2.0.5以上版本
<dubbo:protocol>codeccodecstring可选dubbo性能调优协议编码方式2.0.5以上版本
<dubbo:protocol>serializationserializationstring可选dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json性能调优协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等2.0.5以上版本
<dubbo:protocol>accesslogaccesslogstring/boolean可选 服务治理设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件2.0.5以上版本
<dubbo:protocol>path<path>string可选 服务发现提供者上下文路径,为服务path的前缀2.0.5以上版本
<dubbo:protocol>transportertransporterstring可选dubbo协议缺省为netty性能调优协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置2.0.5以上版本
<dubbo:protocol>serverserverstring可选dubbo协议缺省为netty,http协议缺省为servlet性能调优协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等2.0.5以上版本
<dubbo:protocol>clientclientstring可选dubbo协议缺省为netty性能调优协议的客户端实现类型,比如:dubbo协议的mina,netty等2.0.5以上版本
<dubbo:protocol>dispatcherdispatcherstring可选dubbo协议缺省为all性能调优协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等2.1.0以上版本
<dubbo:protocol>queuesqueuesint可选0性能调优线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。2.0.5以上版本
<dubbo:protocol>charsetcharsetstring可选UTF-8性能调优序列化编码2.0.5以上版本
<dubbo:protocol>bufferbufferint可选8192性能调优网络读写缓冲区大小2.0.5以上版本
<dubbo:protocol>heartbeatheartbeatint可选0性能调优心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开2.0.10以上版本
<dubbo:protocol>telnettelnetstring可选 服务治理所支持的telnet命令,多个命令用逗号分隔2.0.5以上版本
<dubbo:protocol>registerregisterboolean可选true服务治理该协议的服务是否注册到注册中心2.0.8以上版本
<dubbo:protocol>contextpathcontextpathString可选缺省为空串服务治理 2.0.6以上版本
Linux 用户线程数限制导致的 Java.lang.OutOfMemoryError: unable to create new native thread异常

系统默认最大的线程数为1024个

[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf 

# Default limit for number of user's processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.

*          soft    nproc     1024

root       soft    nproc     unlimited

[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf 
调整时要注意:

 

1、 尽量不要使用 root 用户来部署应用程序,避免资源耗尽后无法登录操作系统

 因为root用户默认没有限制线程数,如果线程过多,会使资源占用很多,导致不能关机,只能硬关机

2、 普通用户的线程数限制值要看可用物理内存容量来配置
[root@edu-provider-01 ~]# cat /proc/meminfo |grep MemTotal 
MemTotal:        2941144 kB
[root@edu-provider-01 ~]# echo "2941144/128"|bc
22977
[root@edu-provider-01 ~]# ulimit -u
1024

[1]+  Stopped                 vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf 
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     12000
root       soft    nproc     unlimited
[root@edu-provider-01 ~]# 

 

计算方式:

 

default_nproc = total_memory/128K; 

$ cat /proc/meminfo |grep MemTotal

$ echo "2941144/128"|bc

$ ulimit -u

ulimit -a # 显示目前资源限制的设定 

ulimit -u # 用户最多可开启的程序数目

 重启,使之生效:# reboot
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: