Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Mở rộng quy mô hệ thống của bạn một cách hiệu quả:Tách quy trình và làm lại để nhắn tin hiệu suất cao

Mở rộng quy mô hệ thống của bạn một cách hiệu quả:Tách quy trình và làm lại để nhắn tin hiệu suất cao

Bởi Pramono Winata

Bạn đã bao giờ gặp rắc rối khi cố gắng xử lý một quy trình thực sự lớn hoặc nặng chưa? Nếu vậy, tôi có thể giúp bạn tìm ra cách quản lý nó tốt hơn.

Trong bài viết này, tôi sẽ chia sẻ cách tôi hiện đang quản lý một thư quá lớn để có thể xử lý trong một quy trình. Tôi đã chia nó thành nhiều phần khác nhau, dẫn đến các quy trình riêng biệt.

Tôi sẽ không đi sâu vào chi tiết kỹ thuật mà nói nhiều hơn về quy trình kiến trúc.
Tôi sẽ thảo luận một số chi tiết về cách sử dụng bộ nhớ đệm và pubsub, nhưng tôi sẽ không đi sâu vào chi tiết về cách triển khai. Thay vào đó, tôi sẽ tập trung vào chính mẫu đó.

Vấn đề

Mở rộng quy mô hệ thống của bạn một cách hiệu quả:Tách quy trình và làm lại để nhắn tin hiệu suất cao _Ảnh của [Unsplash](https://unsplash.com/@dsmacinnes?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Danielle MacInnes / Tôi không phải là người vẽ sơ đồ giỏi, nhưng điều này sẽ giúp bạn hiểu rõ hơn

Để đơn giản hóa bằng từ ngữ, hãy tưởng tượng hai dịch vụ riêng biệt, dịch vụ A và dịch vụ B, với dịch vụ pubsub ở giữa.

Nếu bạn không chắc chắn dịch vụ pubsub là gì, hãy tưởng tượng nó như một nhà môi giới giúp tin nhắn từ dịch vụ này đến được dịch vụ kia.

Dịch vụ A sau đó sẽ xuất bản một tin nhắn và thông qua pubsub, dịch vụ B sẽ xử lý nó. Sau khi kết thúc quá trình, nó sẽ thực hiện một quy trình khác để đánh dấu rằng thư đã được xử lý.

Đủ đơn giản phải không?

Chỉ là trong một số trường hợp khi tin nhắn quá lớn sẽ không đăng tin thành công vì những hạn chế của dịch vụ pubsub.

Được rồi, điều này sẽ cung cấp cho bạn cái nhìn tổng quan về các vấn đề tôi gặp phải. Vậy tôi đã khắc phục vấn đề này như thế nào? Trong phần tiếp theo, tôi sẽ giới thiệu cho bạn giải pháp của tôi.

Cách tiếp cận đầu tiên của tôi

Mở rộng quy mô hệ thống của bạn một cách hiệu quả:Tách quy trình và làm lại để nhắn tin hiệu suất cao _Ảnh của [Unsplash](https://unsplash.com/@dose?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Dose Media / Hệ thống/quy trình được cập nhật của tôi

Như bạn có thể thấy trên sơ đồ, tin nhắn được chia thành nhiều tin nhắn nhỏ hơn. Cách phân chia và phần nào của tin nhắn cần được phân chia có thể khác nhau đối với từng trường hợp và luồng.

Tuy nhiên, trong trường hợp của tôi, tin nhắn của tôi thực sự chứa một danh sách các mục nên tôi có thể chia nó thành từng mục.

Giả sử tôi có 10 món đồ. Trước đây, nó sẽ xuất bản tất cả 10 mục trong một tin nhắn. Nhưng bây giờ sau khi chia tin nhắn ra sẽ biến tin nhắn đó thành 10 tin nhắn.

Điều này dẫn đến một quá trình đơn lẻ trở thành một số quá trình cùng nhau. Một lần xuất bản sẽ biến thành 10 lần xuất bản, từ đó sẽ biến quy trình đơn lẻ đó thành 10 quy trình.

Điều này có thể trông không lý tưởng khi bạn nhìn theo cách đó, nhưng đây là giải pháp tốt nhất tôi nghĩ ra và nó chắc chắn có hiệu quả.

Vậy là chỉ có thế thôi sao?

Không hẳn - bạn có nhớ phần cuối cùng nơi nó đánh dấu quá trình là đã hoàn tất không?
Nếu vậy, bạn có thể thắc mắc tại sao phần đó lại bị thiếu trong sơ đồ mới của tôi.

Đừng lo lắng - không phải là tôi đã quên nó. Tôi cố tình bỏ nó đi ở phần tiếp theo.

Vấn đề là khi bạn chia nhỏ tin nhắn và chia nó thành nhiều quy trình, hệ thống của bạn có thể không biết liệu toàn bộ quy trình có thực sự kết thúc hay không. Đây là một vấn đề lớn khác mà chúng ta cần giải quyết và may mắn thay, tôi cũng đã tìm được giải pháp cho vấn đề đó.

Cách xử lý quá trình hoàn thiện

Mở rộng quy mô hệ thống của bạn một cách hiệu quả:Tách quy trình và làm lại để nhắn tin hiệu suất cao _Ảnh của [Unsplash](https://unsplash.com/@tumbao1949?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">James Wainscoat / Thêm Redis để đánh dấu quy trình của chúng tôi

Quá trình này trông giống hệt như trước đây nhưng có thêm Redis ở giữa. Bạn cần đảm bảo rằng bạn có số liệu ban đầu hợp lệ cho trường hợp này.

Trong trường hợp của tôi, vì tôi đang xuất bản một danh sách nên tôi có thể dễ dàng đặt độ dài của danh sách làm bộ đếm ban đầu. Và đối với bộ đếm, tôi chỉ có thể giảm nó đi một đơn vị mỗi khi quá trình kết thúc. Sau đó, tôi có thể biết liệu mình đã hoàn thành tất cả các quy trình của mình hay chưa chỉ bằng cách tham khảo bộ đếm Redis của mình. Nếu nó đạt tới 0, điều đó có nghĩa là tôi có thể đánh dấu một cách an toàn rằng tất cả quy trình của mình đã hoàn tất.

Kết thúc

Tóm lại, tôi chia tin nhắn thành nhiều tin nhắn sẽ được xử lý cùng nhau trong một số quy trình. Để quản lý quy trình tin nhắn, tôi sử dụng bộ nhớ đệm Redis.

Giải pháp mà tôi đã mô tả ở trên sẽ không phải là viên đạn bạc mỗi khi bạn gặp sự cố khi xử lý một tin nhắn quá lớn. Có nhiều cách khác như truyền trực tuyến tin nhắn của bạn, nhưng đó sẽ là câu chuyện của ngày khác.

Cảm ơn đã đọc bài viết của tôi đến cuối! Tôi chân thành hy vọng rằng bạn thích và thấy bài viết của tôi thú vị và quan trọng nhất là nó hữu ích.

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu