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

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

