`

dubbo服务中的hessian序列化工厂使用hashmap加锁在高并发场景下的问题

 
阅读更多
[摘要:1.题目描绘 我们正在对5个dubbo接心并收举行测试,统共线程数是64个,一直的挪用那些接心。视察到的非常浮现是TPS动摇较大,时下时低。 我们视察线程的运转状态是如许]

1.问题描述
我们在对5个dubbo接口并发进行测试,总共线程数是64个,不停的调用这些接口。观察到的异常显现是TPS波动较大,时高时低。

我们观察线程的运行状况是这样的:

上图红色部分是线程阻塞的情况。

我们查看线程栈的信息发现有20多个用户线程处于Blocked状态,blocked状态的代码如下:

"DubboServerHandler-192.168.183.17:20880-thread-200" daemon prio=10 tid=0x00007fc0e802b800 nid=0x6a8f waiting for monitor entry [0x00007fbf25bda000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.jd.com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:164)
    - locked <0x00000000c35af008> (a java.util.HashMap)
    at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:406)
    at com. alibaba.com.caucho.hessian.io.CollectionSerializer.writeObject(CollectionSerializer.java:102)
    at com. alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408)
    at com. alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:313)
   


这说明如果该服务在该并发下还是会出现用户线程阻塞在代码

at com.alibaba.com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:164)处的情况,对于服务的稳定性和TPS都会造成一定的影响。
2.问题分析
根据上述日志的分析,我们定位到了线程锁部分的代码,我们打开该代码如下所示:

if (_cachedSerializerMap != null) {
    synchronized (_cachedSerializerMap) {
  serializer = (Serializer) _cachedSerializerMap.get(cl);
    }
可以看到此处使用了HashMap,在并发读写map的代码的地方都添加了synchronized 关键字。而本问题也就是在该处BLOCKED了。如果并发较大的时候,线程释放锁的速度赶不上线程争夺资源的速度就会导致用户线程的锁定。

3.优化方案
在高并发的场景下,Hashmap+synchronized的锁的粒度太大,直接锁定了整个HashMap对象,那么我们可以用 ConcurrentHashMap来降低锁的粒度,这样并发处理能力就能够增强。

我在搜索类SerializerFactory的时候,也正好搜索到了hessian-4.0.7.jar中也有这个类,应该是dubbo从hessian里移植过来的另一个类。在这个版本里它就将HashMap替换为ConcurrentHashMap,

它替换之后的代码是这样的:

private ConcurrentHashMap _cachedSerializerMap;
private ConcurrentHashMap _cachedDeserializerMap;

  Serializer serializer;
  if (_cachedSerializerMap != null) {
    serializer = (Serializer) _cachedSerializerMap.get(cl);
    if (serializer != null)
      return serializer;
  }
它的区别就是使用ConcurrentHashMap ,去除了synchronized 关键字。

接下来我们也做这样的修改,替换jar包之后,再对服务进行一次压测,结果如下:

1.线程中无Blocked状态的用户线程。

2.TPS更加稳定。

TPS变得更加稳定,没有较大的波动。

从测试来看这种优化之后是有实际效果的,dubbo服务的并发能力明显增强了许多。



总结:
对于并发较高的dubbo服务,若希望提高并发处理能力,则应该做这样的优化。

摘自:http://www.ithao123.cn/content-8941250.html
分享到:
评论

相关推荐

    dubbo-hessian协议http请求demo(java)

    在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...

    dubbo源码依赖hessian_lite.jar

    在Dubbo中,Hessian Lite被用作服务调用的序列化/反序列化工具,使得服务间通信更加高效和便捷。 描述中提到的 "可以使用mvn install命令将jar包安装到本地的maven仓库" 是一个常见的Maven操作。Maven是一个项目...

    DuBBo(rmi+Hessian).zip

    在Dubbo中,Hessian协议同样可以被用于服务的远程调用,它提供了比RMI更快的序列化和反序列化速度,特别适合于需要高效率通信的场景。 要使用Dubbo与RMI或Hessian集成,我们需要进行以下步骤: 1. **配置服务提供...

    dubbo-hessian-lite

    Alibaba 的 Dubbo 是一个高性能、轻量级的 RPC 框架,而 Hessian-lite 是 Dubbo 在网络通信中使用的序列化技术之一。了解这些知识点对于深入理解和使用 Dubbo 服务是至关重要的。通过手动处理依赖,开发者可以在各种...

    dubbo-dubbo-2.5.3(包含依赖hessian-lite、opensesame)

    虽然阿里已经给我们打包好了核心框架的jar包,但在实际开发过程中,核心框架、管理控制台、简易监控中心、简易注册中心可能我们都需要用到,而且业务需求可能要修改dubbo源码,再次打包。基于以上原因我们需要构建...

    Dubbo + SpringMVC 4.3.1 + Hessian 注解方式Demo工程源码

    整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。

    服务治理工具dubbo

    1. **大型分布式系统**:在电商、金融、社交等业务场景中,Dubbo可以帮助构建大规模、高并发的分布式服务架构。 2. **微服务改造**:在进行微服务化改造时,Dubbo作为服务治理工具,能够有效管理和协调各个独立服务...

    dubbo-hessian-lite:适用于Apache Dubbo的Hessian Lite

    Hessian Lite(Apache Dubbo专用版) Hessian-lite最初是的Apache dubbo嵌入版本。 然后,此模块与Dubbo分离。 所有分支:2.5.x,2.6.x(自2.6.3起)和2.7.x都依赖于它,请查看详细信息: 现在,我们正在尝试建立一...

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    标题中的“nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用”意味着在Node.js环境中,开发者成功地实现了对Dubbo服务的RPC(远程过程调用)访问,利用了Dubbo协议的特性。Dubbo是阿里巴巴开源的一个高性能、轻量...

    dubbo 服务提供方 服务消费方

    在分布式系统领域,Dubbo是一个广泛使用的开源Java框架,它主要设计用于构建高性能、轻量级的服务治理平台。本篇文章将深入探讨Dubbo服务提供方(Provider)和服务消费方(Consumer)的核心概念、实现原理以及如何...

    dubbo注意的问题,注入问题,接口中的bo应该实现序列化,否则服务注册失败

    在IT行业中,尤其是在分布式服务框架领域,Dubbo是一个广泛使用的开源框架,它允许服务提供者和服务消费者之间进行高效、可靠的远程通信。标题提到的“dubbo注意的问题,注入问题,接口中的bo应该实现序列化,否则...

    dubbo服务限制并发量示例

    本示例主要关注 Dubbo 的服务限制并发量的功能,这在高并发、大流量场景下至关重要,能够有效地保护服务提供者,避免因过量请求导致系统崩溃。我们将探讨 `executes` 和 `accepts` 两个关键配置,以及路由规则和服务...

    dubbo 对外提供和使用接口方法

    通过上述内容,我们可以清晰地了解到在Dubbo中如何定义和提供服务接口,以及如何进行服务的消费。此外,还详细介绍了不同通信协议的选择及其配置方式,这对于构建高效稳定的微服务架构具有重要意义。在实际项目开发...

    Dubbo分布式服务框架

    【高并发远程调用】:Dubbo通过优化序列化、通信协议等方式,实现了高效的远程调用,应对高并发场景。 【常见问题解答(FAQ)】:Dubbo FAQ文档通常包含了用户在使用过程中可能遇到的问题及其解决方案,包括配置...

    基于zookeeper 监控dubbo provider 下线,提供dubbo 服务下线 邮箱预警

    在分布式系统中,服务的高可用性和稳定性是至关重要的。`Dubbo` 是一款高性能、轻量级的Java服务框架,而`Zookeeper` 则是Apache的一个分布式协调服务,常用于服务治理、配置管理等领域。本项目结合两者,实现了一个...

    Dubbo 序列化协议 5 连问,你接得住不.PDF

    默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...

    dubbo介绍和使用

    5. **服务降级**:在高负载情况下,Dubbo 可以根据预设的策略自动降级服务,保护系统免受过载影响。 #### 三、系统结构 Dubbo 的整体架构设计非常灵活,主要包括以下几个关键组件: 1. **Provider**(服务提供者)...

    dubbo示例代码dubbo-sample

    在`dubbo.properties`配置文件中,可以设置服务使用的通信协议,例如默认的dubbo协议。不同的协议会影响服务调用的性能和特性。 5. **负载均衡(Load Balance)** Dubbo内置了几种负载均衡策略,如随机、轮询、...

    dubbo中文文档说明

    Dubbo正是为了解决这种复杂环境下服务间的高效通信问题而设计的。 - **单一体应用架构**:初期阶段,网站流量较小,可将所有功能部署在一个应用中以降低成本。 - **垂直应用架构**:随着流量增长,单一应用通过增加...

    dubbo服务调用

    在这个示例中,你可以看到如何定义服务接口,如何启动服务提供者,以及如何在服务消费者中调用这些服务,同时也能看到超时、重试、降级和熔断等特性的配置和使用。 总的来说,Dubbo 提供了一套完整的微服务治理框架...

Global site tag (gtag.js) - Google Analytics