全局锁(分布式锁)

使用场景:在多进程之间保证资源只能由一个进程访问。

示例代码

/// <summary>
/// 多队列-多进程 自动配对订阅实现方案,
/// 假如有 10 个队列,5个进程,此时每个进程将订阅2个队列
/// </summary>
private static void Demo()
{
    // 此方案的大致思路是:
    // 1,先获取一个分布式锁,保证多个进程互斥(只有一个进程能进入执行)
    // 2,获取所有队列信息,检查将要订阅的队列是否有订阅者,如果队列没有订阅者,就订阅它


    // 创建一个分布式锁,锁将保证多个进程时,只有一个进程能进入执行
    using( GlobalLock locker = GlobalLock.Create("一个特殊的锁标识") ) {

        RabbitMonitorClient client = new RabbitMonitorClient("rabbitmq-连接名称");

        // 获取所有队列信息,并过滤【特定】
        List<QueueInfo> list = client.GetQueues(10_000).Where(x => x.Name.StartsWith("队列名称前缀")).ToList();

        // 记录当前进程已订阅的队列数量
        int count = 0;

        foreach( var q in list ) {

            // 如果某个队列没有订阅者,就表示当前进程可以订阅它
            if( q.Consumers == 0 && count < 2 ) {

                // 订阅某个队列
                RabbitSubscriberArgs args = new RabbitSubscriberArgs {
                    SettingName = "Rabbit连接配置名称",
                    QueueName = q.Name,
                    SubscriberCount = 3
                };
                RabbitSubscriber.Start<XMessage, XMessageHanlder>(args);
                count++;
            }
        }
    }
}

在上面这个示例中,受保护的资源就是RabbitMQ,

为了实现多个进程节点 均匀且不重复 订阅,就需要将RabbitMQ保护起来,

一次只允许一个进程访问RabbitMQ的队列信息,并从中选择2个没有被订阅的队列。