java吧 关注:1,249,236贴子:12,732,958
  • 2回复贴,共1

关于队列锁 遇到瓶颈了 求思路

只看楼主收藏回复

用zookeeper实现了一个分布式队列
在服务端创建了一个taskQueue目录,作为队列根目录
在taskQueue创建一个序列化的节点,即队列元素
同时有多个线程往队列中添加节点,也同时有多个线程从队列中取节点
由于是多线程,所以队列必须加锁,一个入队锁,一个出队锁
这样功能是实现了,但效率极差
毕竟同一时刻,只有一个线程能从队列中取节点,它取的时候给队列加了个锁
然后把取到的节点放到另一个存储位置,才会释放锁
这样导致其他线程都要等待,严重影响性能
原来想过不加锁,多个线程取完节点,就把队列中对应的节点删掉 ,这样另一个线程删除的时候肯定抛异常,它就可以取下一个节点,但这样有个bug,就是我的队列是分布式的,如果某台机器已经取到节点,而且把队列中对应的节点删掉,这时候宕机了,会导致节点丢失
唉 纠结很久了, 求教各位 我这个队列锁是不是可以优化,或者不用锁 用其他方式可以解决?


IP属地:广东1楼2014-04-08 20:16回复
    我现在的问题是 2台机器同时从服务端的队列中取节点,假设取完所有节点耗时为100秒,
    当我增加1台机器,也就是同时3台机器从队列中拿东西,照例说应该能加快速度,但由于受到队列锁的限制,速度根本提高不了


    IP属地:广东2楼2014-04-08 22:11
    回复
      那就针对锁进行优化,你用什么类型锁?


      IP属地:浙江3楼2014-05-07 16:01
      回复