system nhắn tin phân tán, broker message (cơ bản trước khi hiểu kafka, thỏmq)

Xin chào, đây là codeshow.
Trong lớp này, chúng ta sẽ học hệ thống nhắn tin phân tán.
Trong một hệ thống nhắn tin, một tin nhắn là dữ liệu có thể được trao đổi giữa hai hoặc nhiều mối quan hệ.
Dữ liệu ở đây thường là dữ liệu nhị phân. Gửi và nhận dữ liệu bằng cách sử dụng bộ nối tiếp như json hoặc Bộ đệm giao thức.
Với hệ thống nhắn tin ở giữa, một bên có publisher và bên kia có mối quan hệ người đăng ký.
publisher là khách hàng tạo thư và gửi chúng vào hàng đợi thư. Gửi tin nhắn đến hàng đợi được gọi là publish .
Người đăng ký là khách hàng nhận tin nhắn từ hàng đợi tin nhắn. Nhận tin nhắn từ hàng đợi được gọi là consume .
Tin nhắn được publish bởi publisher và tin nhắn đi qua hệ thống nhắn tin đến người đăng ký.
Tin nhắn luôn truyền một chiều: publisher đến hệ thống nhắn tin đến người đăng ký.
Để tham khảo, chúng tôi sử dụng thuật ngữ producer thay vì publisher và consumer thay vì người đăng ký.
Ngoài ra, pub và sub được sử dụng bởi publisher và người đăng ký rút ngắn.

Để hiểu mối quan hệ giữa publisher và người đăng ký, tôi sẽ giải thích mã làm ví dụ.

package main

import "time"

func main() {
    c := make(chan string)
    go pub(c)
    go sub(c)
    select {}
}

func sub(c <-chan string) {
    for {
        message := <-c
        println(message)
    }
}

func pub(c chan<- string) {
    c <- "Hello World 1"
    time.Sleep(1 * time.Second)
    c <- "Hello World 2"
    time.Sleep(1 * time.Second)
    c <- "Hello World 3"
    time.Sleep(1 * time.Second)
    c <- "Hello World 4"
    time.Sleep(24 * time.Hour)
}

Trong mã này, một kênh loại chuỗi được tạo trong chức năng chính.
Hàm pub publish tự “Xin chào thế giới”.
Và đầu ra phụ “Xin chào thế giới” khi có tin nhắn đến kênh trong vòng lặp vô hạn.
Bên trong chức năng quán rượu, chúng tôi publish một chuỗi lên kênh,
Hàm phụ consume chuỗi thông qua kênh.
Một mô-đun consume và xử lý các thông báo cũng được gọi là worker.

Mối quan hệ giữa publisher, hệ thống nhắn tin và người đăng ký đã được thảo luận trước đó.
Trong mã ngôn ngữ cũ ở trên, hàm pub đóng vai trò publisher và hàm phụ đóng vai trò là người đăng ký.
Và bạn có thể coi biến c của loại kênh chuỗi giữa quán rượu và phụ này là một hệ thống nhắn tin.

Nếu một ngôn ngữ không cung cấp tính năng nhắn tin, chẳng hạn như GoLanguage, thì khung đó sẽ cung cấp.
Lấy Spring Framework của Java làm ví dụ, nó phát ra các thông báo kiểu ApplicationEvent.
Và bạn có thể đăng ký các tin nhắn publish thông qua chú thích EventListener.
Tại thời điểm này, hệ thống nhắn tin được đảm nhiệm bởi Spring framework.
Lưu ý rằng tin nhắn và sự kiện là tương tự nhau.
Sự khác biệt giữa hai loại này là tính năng nhắn tin thường lưu trữ tin nhắn trong bộ lưu trữ có tên là Hàng đợi, vì vậy người đăng ký có thể xử lý chúng sau thay vì ngay lập tức.
Các sự kiện được gửi đến những người đăng ký ngay khi chúng xảy ra và các sự kiện sẽ bị hủy.

Như đã giải thích ở trên, tin nhắn có một bộ lưu trữ được gọi là Hàng đợi.
Đó là lý do tại sao nó được gọi là Message Queue.

Nói chung, các hệ thống nhắn tin được thiết kế để gửi và xử lý tin nhắn trong môi trường phân tán.
Vì vậy, các kênh của ngôn ngữ Go cũng như EventListener của Spring Framework đều không phải là hệ thống nhắn tin trong một ngữ cảnh hạn chế.
Tuy nhiên, cả phần trước và phần sau đều tuân theo kiến trúc hướng sự kiện và có thể được xem như hệ thống nhắn tin theo nghĩa rộng.

Từ giờ trở đi, hãy xem kafka và thỏmq, đây là những hệ thống nhắn tin phân tán được sử dụng nhiều nhất.

Đầu tiên, kafka và thỏmq đều là hệ thống nhắn tin hoạt động trong môi trường phân tán.
Còn được gọi là broker message .

Các hệ thống nhắn tin phân tán thường cung cấp khả năng mở rộng, tính sẵn sàng cao và độ tin cậy.

  1. Để có khả năng mở rộng, kafka và thỏmq có thể định cấu hình cluster.
    Điều này cho phép mở rộng theo chiều ngang bằng cách tăng số lượng nút.
    Thông lượng có thể được tăng lên thông qua tỷ lệ ngang.
  2. Tính sẵn sàng cao có nghĩa là hệ thống nhắn tin vẫn hoạt động ngay cả khi một số nút ngừng hoạt động.
  3. Độ tin cậy là hành vi gửi tin nhắn đáng tin cậy, chẳng hạn như không làm mất tin nhắn đã đăng và không gửi trùng lặp tin nhắn cho người đăng ký.

kafka và thỏmq đáp ứng các tiêu chí trên là hệ thống nhắn tin phân tán.

Và publisher publish một tin nhắn tại một thời điểm, nhưng thông qua hệ thống nhắn tin, tin nhắn này có thể được sao chép và gửi đến nhiều queue.

Ví dụ,

kafka chia tin nhắn thành topic.
Và topic này lại được chia thành nhiều partition.
Và về phía người đăng ký, nhiều worker có thể sử dụng một tin nhắn thông qua các nhóm consumer .

thỏmq bao gồm trao đổi và queue.
Trao đổi xác định tuyến đường mà hàng queue tin nhắn được gửi.
Rabbitmq có 4 loại trao đổi: trực tiếp, fanout, topic và tiêu đề.
Không chỉ các tin nhắn có thể được chuyển tiếp đến các trao đổi khác nhau mà còn có thể thực hiện định tuyến từ trao đổi này sang trao đổi khác.
So với kafka, thỏmq có thiết kế định tuyến tin nhắn rất linh hoạt và thuận tiện.

Thay vào đó, vì rabbitmq là queue , nếu consumer loại bỏ một tin nhắn khỏi queue , thì tin nhắn đó sẽ bị xóa khỏi queue.
Mặt khác, trong kafka , đơn vị lưu trữ là topic và partition , không phải queue .
topic là một đơn vị logic phân biệt các thông báo và một đơn vị thực sự được lưu trữ là partition.
Ngoài ra, khi consumer sử dụng tin nhắn từ partition, nó sẽ không xóa tin nhắn như queue.
Ghi nhớ một offset cụ thể và đăng ký dữ liệu sau offset . Nó giống như một mảng.

Trong sự khác biệt này, rabbitmq có thể đính kèm nhiều người đăng ký vào một queue, nhưng kafka chỉ có thể đính kèm một nhóm consumer vào một partition .

Sự khác biệt giữa hai cũng là sự khác biệt trong lưu trữ.
Rabbitmq chủ yếu nằm trong bộ nhớ kafka nằm trên đĩa.

Đó là lý do tại sao chúng tôi sử dụng kafka làm kho lưu trữ dữ liệu liên tục, giống như cơ sở dữ liệu.

Sự khác biệt trong hành vi này được phản ánh trong thiết kế của hệ thống nhắn tin tùy thuộc vào mục đích của hệ thống nhắn tin.
rabbit mq nhằm mục đích xếp hàng message .
Vì vậy, so với kafka, hàng đợi tin nhắn rất linh hoạt về định tuyến cũng như tạo và xóa hàng queue .
kafka nhằm mục đích xử lý tin nhắn lớn so với thỏmq.
Vì vậy, so với thỏmq, nó có hiệu suất vượt trội đối với công việc hàng loạt.

Ở trên, chúng tôi đã xem xét các hệ thống nhắn tin phân tán và xem xét ngắn gọn về Rabbitmq và kafka.
Chúng ta sẽ xem xét kỹ hơn về kafka và thỏmq thông qua mã.

Cuối cùng, chúng tôi đã tóm tắt 5 lý do tại sao chúng tôi sử dụng hệ thống nhắn tin.

  1. Giao tiếp: Dữ liệu có thể được truyền giữa publisher và người đăng ký. Điều này giải phóng bạn khỏi các ràng buộc giữa các ngôn ngữ, nền tảng và tính không đồng nhất khác nhau.
  2. Không đồng bộ: So với giao tiếp đồng bộ, giao tiếp không đồng bộ có thể tăng hiệu suất so với giao tiếp thủ tục.
  3. Tính sẵn sàng cao: Trong một hệ thống nhắn tin phân tán, hoạt động bình thường được đảm bảo ngay cả khi một số hệ thống nhắn tin ngừng hoạt động, mặc dù hiệu suất có thể bị suy giảm.
  4. Thử lại: Ngay cả khi worker ngừng hoạt động, các tin nhắn vẫn nằm trong queue, vì vậy nếu worker hoạt động trở lại, nó có thể tiếp tục sau thao tác không thành công trước đó. Ngay cả khi thời gian thực bị giảm, tính nhất quán của dữ liệu vẫn trở nên đáng tin cậy.
  5. Liên kết lỏng lẻo: Thông qua các cuộc gọi gián tiếp thông qua hệ thống tin nhắn thay vì các cuộc gọi trực tiếp, phía publisher không cần biết tất cả logic nghiệp vụ sau khi xuất bản tin nhắn. Đó là vai trò của publisher chỉ cho đến khi xuất bản. Sau đó tin nhắn được chuyển đến thuê bao thông qua hệ thống nhắn tin. Bây giờ chính người đăng ký chịu trách nhiệm xử lý tin nhắn. Sự liên kết lỏng lẻo đạt được thông qua các cuộc gọi gián tiếp, thay vì trực tiếp, publisher cho phép phần mềm của chúng tôi trở nên linh hoạt và có thể mở rộng hơn.

Cài đặt thông báo đăng ký và thích rất hữu ích cho người tạo nội dung.

Cảm ơn