Kỹ thuật Redlock Phân tán

Bài viết này giới thiệu về thuật toán Redlock.

Thư viện có thể được sử dụng với các máy chủ Redis độc lập hoặc với cấu hình replication.

Nó phụ thuộc vào thư viện StackExchange.Redis.

Để đảm bảo tính toàn vẹn của khóa, số lượng máy chủ Redis được khóa phải lớn hơn nửa tổng số máy chủ Redis cộng thêm một. Do đó, số lượng máy chủ Redis nên là số lẻ như 3, 5, 7, 9.

Dưới đây là đoạn mã cho cấu hình replication:

var danhSachRedlockEndPoint = new List<RedLockEndPoint>
{
    new RedLockEndPoint
    {
        EndPoints =
        {
            new DnsEndPoint("replicatedset1-server1", 6379),
            new DnsEndPoint("replicatedset1-server2", 6379),
            new DnsEndPoint("replicatedset1-server3", 6379)
        }
    },
    new RedLockEndPoint
    {
        EndPoints =
        {
            new DnsEndPoint("replicatedset2-server1", 6379),
            new DnsEndPoint("replicatedset2-server2", 6379),
            new DnsEndPoint("replicatedset2-server3", 6379)
        }
    },
    new RedLockEndPoint
    {
        EndPoint = new DnsEndPoint("server-independ", 6379)
    }
};

var khoiTaoRedlock = RedLockFactory.Tao(danhSachRedlockEndPoint);

Và đây là đoạn mã cho cấu hình không replication:

var danhSachEndPoint = new List<RedLockEndPoint>
{
    new DnsEndPoint("redis1", 6379),
    new DnsEndPoint("redis2", 6379),
    new DnsEndPoint("redis3", 6379)
};
var khoiTaoRedlock = RedLockFactory.Tao(danhSachEndPoint);

Mã thử nghiệm dưới đây sử dụng chỉ một máy chủ Redis:

public class ThucHienRedlock
{
    public static readonly string KhoaRedlock = "khoaredlock";
    public static readonly string TongKhoaRedlock = "tongkhoaredlock";
    public static async void ThucHien()
    {
        var ketNoiRedis1 = ConnectionMultiplexer.KetNoi("192.168.0.168:6379");
        //var ketNoiRedis2 = ConnectionMultiplexer.KetNoi("redis2:6379");
        //var ketNoiRedis3 = ConnectionMultiplexer.KetNoi("redis3:6379");
        var danhSachKetNoi = new List<RedLockMultiplexer>
        {
            ketNoiRedis1,
            //ketNoiRedis2,
            //ketNoiRedis3
        };
        var khoiTaoRedlock = RedLockFactory.Tao(danhSachKetNoi);
        var taiNguyen = ThucHienRedlock.KhoaRedlock;
        var thoiHanHetHan = TimeSpan.FromSeconds(30);
        var thoiGianCho = TimeSpan.FromSeconds(10);
        var thoiGianThuLai = TimeSpan.FromSeconds(1);
        try
        {
            await using (var khoaRedlock = await khoiTaoRedlock.TaoKhoaAsync(taiNguyen, thoiHanHetHan, thoiGianCho, thoiGianThuLai))
            {
                if (!khoaRedlock.DaKhoa)
                {
                    Console.WriteLine($"Không thể lấy khóa, thread hiện tại là {Thread.CurrentThread.ManagedThreadId}");
                    return;
                }
                using (RedisClient clientRedis = new RedisClient("192.168.0.168:6379"))
                {
                    int tongSo = clientRedis.Lay<int>(ThucHienRedlock.TongKhoaRedlock);
                    if (tongSo <= 0)
                    {
                        Console.WriteLine($"Sản phẩm đã hết, số lượng còn lại {tongSo}, thread hiện tại {Thread.CurrentThread.ManagedThreadId}");
                        return;
                    }
                    tongSo -= 1;
                    clientRedis.Gan(ThucHienRedlock.TongKhoaRedlock, tongSo);
                    Console.WriteLine($"Mua thành công, số lượng còn lại {tongSo}, thread hiện tại là {Thread.CurrentThread.ManagedThreadId}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Lỗi: {ex.Message}");
        }
    }
}

Thẻ: csharp Redis Redlock DistributedLocking

Đăng vào ngày 1 tháng 7 lúc 01:55