killme2008 / xmemcached

High performance, easy to use multithreaded memcached client in java.
http://fnil.net/xmemcached
Apache License 2.0
755 stars 280 forks source link

Hi,我们在使用的时候抛了很多net.rubyeye.xmemcached .exception.MemcachedException: There is no available connection at this moment #62

Closed NorthWindTR closed 7 years ago

NorthWindTR commented 7 years ago

net.rubyeye.xmemcached.impl.MemcachedConnector.send(MemcachedConnector.java:501), net.rubyeye.xmemcached.XMemcachedClient.sendCommand(XMemcachedClient.java:327), net.rubyeye.xmemcached.XMemcachedClient.sendStoreCommand(XMemcachedClient.java:2534), net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1374), net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1432), net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1419), com.tencent.mta.statistics.common.service.MemcachedCommand.invoke(MemcachedCommand.java:36), com.tencent.mta.statistics.common.service.MemcachedService.invoke(MemcachedService.java:58), com.tencent.mta.statistics.common.service.MemcachedService.set(MemcachedService.java:81), com.tencent.mta.statistics.guid.GuidBolt.execute(GuidBolt.java:137), backtype.storm.topology.BasicBoltExecutor.execute(BasicBoltExecutor.java:52), com.tencent.jstorm.daemon.executor.bolt.BoltExecutor.tupleActionFn(BoltExecutor.java:190), com.tencent.jstorm.daemon.executor.bolt.BoltExecutor.onEvent(BoltExecutor.java:156), backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:143), backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:114), com.tencent.jstorm.daemon.executor.bolt.BoltExecutor.run(BoltExecutor.java:128), com.tencent.jstorm.utils.thread.AsyncLoopRunnable.run(AsyncLoopRunnable.java:51), java.lang.Thread.run(Thread.java:745)

某一个线程栈如上;

我们会在一个进程进程下边的多个互不相干的线程里起多个memcached client,在这个线程里串行的使用memcached client,中间是不shutdown的;我们的key和value都只有几十字节,不过可能会有些key是多次重复的;

使用的是完全默认的参数配置,请教一下,可能是什么问题?

killme2008 commented 7 years ago
  1. xmemcached 推荐单例方式,创建的代价很高。
  2. 这个异常表示链接断开了,没有可用的链接。
killme2008 commented 7 years ago

xmemcached 是线程安全的。

NorthWindTR commented 7 years ago

2.我感觉非常奇怪,之前我用你的sdk做数据迁移是很稳定的,qps也到了每秒三四百,没有出现任何异常,不过是单纯的写;现在我把相同代码提到jstorm上来使用(一个分布式计算平台),流量其实反而是更低的,反而各种抛异常; 我确认一下,我看你的代码,链接断开是会重连的是吧? 还有就是这种链接断开会是什么问题,是我使用不当的问题么,请问可以怎么追溯?

killme2008 commented 7 years ago

你连的是 memcached 吗?版本多少,用的什么协议

NorthWindTR commented 7 years ago

我连的是我们这边一个兼容memcached协议的其他kv存储,用的是memcached的文本协议,应该是sdk的默认协议

killme2008 commented 7 years ago

xmemcached 会使用 version 协议做心跳的,要确认是否支持,如果不支持,可以禁用掉 setEnableHeartBeat(false)

NorthWindTR commented 7 years ago

刚试了一下,问题解决了,没再狂抛异常了,非常感谢