0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Giải pháp khắc phục tình trạng khách hàng bị treo email: Nhật ký công việc Ngày 1

Đăng vào 4 ngày trước

• 5 phút đọc

Nhật ký công việc: Ngày 1

Ngày 01 tháng x năm 2xxx
Thời tiết hôm nay thật lạnh lẽo, với nhiệt độ chỉ 8 độ C, khiến cho ai cũng chỉ muốn ở trong nhà để nghỉ ngơi và thư giãn thay vì làm việc. Nhưng công việc vẫn phải tiếp tục!

Khi tôi vừa đến văn phòng, chào hỏi lễ tân xinh đẹp thì ngay lập tức nhận được thông báo rằng có sự cố xảy ra: một số khách hàng đã gửi email từ hôm qua mà vẫn chưa nhận được phản hồi. Thật khó tin, nhưng sau khi điều tra, tôi phát hiện ra rằng một khách hàng đã gửi quá nhiều email, lên tới gần 1 tỷ cái, dẫn đến tình trạng quá tải trong hệ thống gửi email. Điều này đã ảnh hưởng đến các khách hàng khác, những người chỉ gửi 1 hoặc 2 email nhưng cũng không nhận được phản hồi. Các nhân viên hỗ trợ khách hàng đang lo lắng và căng thẳng.

Tình huống này đòi hỏi chúng ta phải có biện pháp xử lý nhanh chóng. Hệ thống của chúng ta đang gặp phải vấn đề với queue xử lý email. Thông thường, tất cả các email sẽ được đưa vào queue theo thứ tự, nhưng sự quá tải từ một khách hàng duy nhất đã dẫn đến tình trạng tắc nghẽn.

Giải pháp tạm thời

Ban đầu, tôi quyết định tăng số lượng queue để có thể xử lý nhiều yêu cầu hơn. Tuy nhiên, mặc dù có thêm queue mà tình hình vẫn không cải thiện, vì email từ khách hàng kia vẫn được phân bố đều. Tôi nhận ra rằng tất cả email vẫn đang được xử lý theo phương pháp round robin, dẫn đến tình trạng tắc nghẽn duy trì.

Phân phối queue hiệu quả

Để giải quyết triệt để vấn đề này, tôi cần ngăn chặn việc một khách hàng có thể làm tắc nghẽn toàn bộ hệ thống. Một ý tưởng là chỉ định một queue riêng cho các email đến từ khách hàng đó. Tuy nhiên, điều này đòi hỏi chúng ta phải xác định được nguồn gốc email và cách phân chia cho các queue sau này.

Cách đơn giản nhất là dùng phép chia phần dư. Ví dụ, nếu có 5 server và một khách hàng, tôi sẽ lấy ID của khách hàng chia cho 5 để xác định queue mà họ sẽ vào. Nhưng nếu tôi muốn thêm hoặc bớt server, lúc đó tất cả sẽ bị xáo trộn.

Thuật toán phân phối thông minh

Để duy trì sự ổn định trong quá trình thêm hoặc bớt queue, tôi đã quyết định tìm hiểu về hai thuật toán nổi bật là consistent hashingRendezvous Hashing. Do tính phức tạp của consistent hashing, tôi đã chọn sử dụng Rendezvous Hashing. Mặc dù không tìm thấy thư viện sẵn có, tôi đã tự thực hiện mã nguồn cho giải pháp này.

Mô hình mới sẽ đảm bảo mỗi khách hàng luôn được gán đến một queue duy nhất, hạn chế tối đa việc ảnh hưởng đến toàn bộ hệ thống. Nhờ vào cơ chế này, nếu một queue gặp trục trặc, chỉ có những email trong queue đó bị ảnh hưởng, không làm ảnh hưởng đến các queue khác.

Hệ thống monitor cũng sẽ được cài đặt để kịp thời xử lý nếu một queue gặp quá nhiều tồn đọng.

Kết quả và triển khai

Dưới đây là một đoạn mã mẫu bằng C# sử dụng thuật toán Rendezvous Hashing để phân phối hiệu quả các email đến nhiều queue khác nhau:

csharp Copy
using Rendezvous;

namespace Demo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Node> nodes = new List<Node>();  
            for (int i = 0; i < 5; i++)  
            {
                nodes.Add(new Node("node" + i, 1));
            }
            Rendezvous.RendezvousHash rendezvous = new Rendezvous.RendezvousHash(nodes);

            Dictionary<string, int> countItemInNode = new Dictionary<string, int>();

            for (int i = 0; i < 10000; i++)
            {
                var item = Guid.NewGuid().ToString();
                var nodeName = rendezvous.GetNode(item).Name;
                if (countItemInNode.ContainsKey(nodeName))
                {
                    countItemInNode[nodeName]++;
                }
                else
                {
                    countItemInNode[nodeName] = 1;
                }
            }

            foreach (var item in countItemInNode)
            {
                Console.WriteLine(item.Key + ":" + item.Value);
            }
        }
    }
}

Kết quả cho thấy việc phân phối email đến các queue là khá đồng đều và không bị lệch, mỗi queue đều nhận được gần 2000 thông điệp.

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ và bình chọn để tôi có thêm động lực viết tiếp nhé!

Kết luận

Nhờ vào những biện pháp đề xuất, chúng ta có thể giảm thiểu ảnh hưởng của một số khách hàng đối với toàn bộ hệ thống email, từ đó nâng cao trải nghiệm của khách hàng và hiệu suất làm việc.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào