Avatar
1
Lâm Văn Đời Beginner
Hỏi về việc gửi tin nhắn qua Message Queue (RabbitMQ,Kafka)
Xin chào mọi người,

Theo em được biết thì trong 1 hệ thống Microservices thì các chức năng như gửi Mail, SMS cho khách hàng thì sẽ được tách thành 1 service mới.Khi cần gửi mail thì sẽ gửi 1 message đến MQ trung gian (Kafka,RabbitMQ,..) chứ không gửi theo kiểu request như thông thường.

Em có tìm hiểu nhưng cách giải thích của mọi người trên mạng vẫn làm em mơ hồ chưa hiểu rõ cho lắm.Em chỉ hiểu đơn giản là gửi message qua 1 MQ trung gian như vậy thì đỡ tốn thời gian hơn so với bình thường vì sẽ gửi 1 cách bất đồng bộ và không cần phản hồi từ service đã gửi.Theo em nghĩ thì việc áp dụng 1 MQ trung gian như vậy chắc chắn sẽ có rất nhiều lợi ích.Nên em đặt câu hỏi ở đây và  mong được anh chị có kinh nghiệm giải đáp giúp em ạ.

Em có câu hỏi là :

  1. Ngoài service như gửi Mail, SMS thì trong thực tế các service có chức năng kiểu như thế nào thì nên áp dùng kiểu gửi message thông qua MQ như trên vậy ạ? Cho em xin 1 số ví dụ cụ thể với ạ.
  2. Vì sao trong thức tế người lại dùng đến các MQ như Kafka, RabbitMQ vậy ạ ?
  3. Tất cả ưu điểm/khuyết điểm (nếu có) của mẫu thiết kế gửi message 1 cách bất đồng bộ qua MQ trung gian là gì ạ ?

Em cảm ơn mọi người rất nhiều ạ !

  • Answer
kafka rabbitmq message queue
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Trả lời câu 1:
  • Xử lý đơn hàng trong thương mại điện tử
  • Xử lý giao dịch (gửi nhận tiền hay bất kỳ loại giao dịch nào khác)
  • Những nghiệp vụ mà yêu cầu chỉ được thực hiện bởi 1 server duy nhất để tránh bị concurrent

Trả lời câu 2:

  1. Không rõ em đọc các giải thích ở đâu nhỉ? có thể cho anh xem nguồn được không?
  2. Gửi Mail, SMS là một trong những nghiệp vụ khá chậm, ví dụ em submit 1 cái request gửi Mail, SMS marketing đến 1000 người, thì khả năng cao sẽ mất đến vài phút, như vậy thì em sẽ không thể đợi request đó được thực hiện xong được, trên giao diện của em nó sẽ quay mãi luôn. Thêm 1 điểm nữa là server sẽ chỉ có hữu hạn số lượng thread (thường là vài trăm) như vậy nếu request nào cũng chờ quá lâu dẫn đến tình trạng server bị hết thread và không thể phục vụ thêm request, nó cũng tương đương với DDoS.

Chính vì vậy mà người ta phải lưu tạm Mail, SMS vào trong database, MQ hay Kafka, mục đích chính là nhanh chóng giải phóng thread để còn phục vụ các yêu cầu khác nữa.

Ngoài ra thì nếu việc gửi mail, sms còn rất dễ lỗi nữa, nên còn liên quan đến việc xử lý các mail sms lỗi này, nên nếu mình có nhiều HTTP server để phục vụ APIs mà mình cũng dùng luôn các server này để xử lý mail, sms thì có thể dẫn đến trường hợp gửi trùng lặp mail, sms, vậy nên thông qua database, MQ hay kafka gửi đến 1 con server xử lý tập trung thì sẽ chính xác hơn.

Tuy nhiên nếu lấy lý do là để xử lý sms và mail nhanh hơn thì có vẻ không đúng, vì rõ ràng là việc gửi nhận qua MQ hay Kafka sẽ tốn thêm thời gian request phải đi qua các con Broker nữa đúng không nhỉ, vậy nó phải chậm hơn mới đúng. Mà việc gửi mail, sms thuần tuý là I/O không có xử lý logic gì cả.

  1. Em cần tách câu hỏi này ra em ạ, đến đây khá dài rồi.
  • 0
  • Reply
Rất cảm ơn anh vì câu trả lời ạ!

Em đã hiểu hầu hết những ý trên của anh nhưng chỉ còn 1 đoạn bên dưới là em chưa rõ có lẽ là do kiến thức và kinh nghiệm thực tế của em còn quá ít.

"Ngoài ra thì nếu việc gửi mail, sms còn rất dễ lỗi nữa, nên còn liên quan đến việc xử lý các mail sms lỗi này, nên nếu mình có nhiều HTTP server để phục vụ APIs mà mình cũng dùng luôn các server này để xử lý mail, sms thì có thể dẫn đến trường hợp gửi trùng lặp mail, sms, vậy nên thông qua database, MQ hay kafka gửi đến 1 con server xử lý tập trung thì sẽ chính xác hơn."

1) Theo hiểu biết của em thì em vẫn chưa hiểu vì sao lạ có tình trạng trùng lặp khi gửi mail, sms,.. khi có nhiều HTTP server để phục vụ APIs mà mình cũng dùng luôn các server này để xử lý mail, sms ? Thông thường thì em được biết là sẽ có 1 con API Gateway để load balancing.để chia đều các request đến các server nên em vẫn chưa hình dung ra được việc trùng lặp sẽ diễn ra như thế nào.Mong anh giải thích cú thể giúp em ạ!

2) Với đoạn " thông qua database, MQ hay kafka gửi đến 1 con server xử lý tập trung thì sẽ chính xác hơn." anh có thể giải thích và cho em xin 1 ví dụ về đoạn này không ạ ? Em đã xem qua cái ví dụ về transaction chuyển tiền giữa 2 user nhưng em vẫn còn mơ hồ lắm chư rõ.

Một lần nữa em cảm ơn anh rất nhiều !

 –  Lâm Văn Đời 1664029320000
Avatar
tvd12 Beginner
tvd12 Beginner
  1. Em hãy tưởng tượng thế này, khi em xử lý mail lỗi, em sẽ thường phải lưu lại các mail lỗi vào DB và sau đó retry sau. Nếu bây giờ em có đồng thời nhiều server cùng xử lý retry này thì nó sẽ có thể gây ra việc lấy trùng lặp các mail từ đó dẫn đến việc gửi trùng lặp.

  1. Bây giờ nếu em chỉ có 1 server để xử lý việc retry nói trên thì nó sẽ an toàn và chính xác hơn. Còn về ví dụ chuyển tiền giữa 2 user nó còn liên quan đến việc kiểm tra số dư nữa, thì nếu em dùng nhiều server để xử lý việc cộng trừ tiền thì rất có thể sẽ gây ra tình trạng cả 2 server đều thấy user còn số dư và cho phép user trừ tiền nhiều lần, vậy nên sẽ tốt hơn hết là dùng 1 server và lock lại các bản ghi hoặc toàn bộ danh sách tài khoản khi đang xử lý em ạ.
  • 0
  • Reply