Tìm hiểu về Microservices - Phần 2: Giao tiếp giữa các services

2nd Nov 2022
Tìm hiểu về Microservices - Phần 2: Giao tiếp giữa các services
Table of contents

Ở phần trước mình đã có bài viết tổng quát về Microservices. Trong bài viết này, chúng ta sẽ đi đến một bài toán cụ thể hơn, đó là vấn đề communication trong microservices.

Một trong những khó khăn lớn nhất khi chuyển đổi hệ thống từ monolithic qua microservices có lẽ là sự thay đổi cách thức giao tiếp.

Phụ thuộc vào tính chất của serivce, người ta thường dùng 3 communication styles chính:

  • Remote Procedure Invocation
  • Messaging
  • Domain-specific protocol

1. Remote Procedure Invocation (RPI)

Sử dụng RPI để liên lạc giữa các service, client sử dụng một request/reply-based protocol để tạo request đến service.

Xem xét ví dụ cụ thể sau:

Một trong những khó khăn lớn nhất khi chuyển đổi hệ thống từ monolithic qua microservices có lẽ là sự thay đổi cách thức giao tiếp.

Service Order và Payment exposed các API để client hoặc các service khác gọi đến nó. Khi client call REST API request để thực hiện một Order. Order service nhận request xử lý business logic rồi gọi tới Payment Service qua API để thực hiện Payment. Mô hình trên là loại mô hình kết nối Point-To-Point, các service kết nối trực tiếp với nhau thông qua API end-point.

Một vài pattern cho RPI:

  • REST
  • gRPC
  • Apache Thrift

Việc sử dụng RPI là rất phổ biến vì chúng có những lợi ích:

  • Đơn giản và quen thuộc
  • Việc request/reply khá dễ dàng
  • Hệ thống trở nên đơn giản do không cần các message broker cho gửi nhận request/response

Tuy nhiên chúng cũng có vài nhược điểm:

  • Thông thường chỉ hỗ trợ request/reply mà không hỗ trợ notifications, request/async response, publish/subscribe, publish/async response
  • Client và service sẽ phải luôn có sẵn trong suốt thời gian tương tác

2. Messaging

Sử dụng asynchronous messaging để giao tiếp giữa các serivces. Các services trao đổi message qua các kênh message.

Tiếp tục với bài toán của RPI:

Một trong những khó khăn lớn nhất khi chuyển đổi hệ thống từ monolithic qua microservices có lẽ là sự thay đổi cách thức giao tiếp.

Trong mô hình này, các Microservice không giao tiếp trực tiếp với nhau mà thông qua hệ thống Message Queue, giao tiếp bất đồng bộ.

  • Order Microservice publish một message đến Message queue theo một topic nào đó.
  • Payment Microservice và các Microservice sẽ subscribe các message theo một topic cụ thể. Ví dụ Payment Microservice subscribe message topic “ABC” thì chỉ khi Order Microservice gửi message ABC thì nó mới nhận.

Cơ chế này tương tự như cách bạn gửi thư từ A đến B. A sẽ không đem thư đến tận nơi cho B mà gửi qua bưu điện, ghi rõ địa chỉ người nhận. Bưu điện đóng vai trò như một Message Broker để phát thư đến người nhận theo địa chỉ đã cho.

Cụ thể, chúng ta có một vài pattern về asynchronous messaging:

  • Apache Kafka
  • RabbitMQ

Sử dụng messaging pattern có các ưu điểm sau:

  • Hỗ trợ nhiều kiểu giao tiếp như request/reply, notifications, request/async response, publish/subscribe, publish/async response
  • Vì chúng là asynchronous nên tách biệt người gửi và người nhận, và message broker sẽ lưu tin nhắn đến khi người nhận có thể xử lý.

Tuy nhiên chúng cũng có nhược điểm:

  • Hệ thống trở nên phức tạp hơn vì cần message broker

3. Domain-specific protocol

Trong một vài trường hợp đặc biệt chúng ta không thể sử dụng RPI hay Messaging mà thay vào đó cần dùng domain-specific protocol cho việc giao tiếp giữa các services.

Một vài ví dụ cụ thể về domain-specific protocol:

  • Email protocols như: SMTP, IMAP
  • Media streaming protocols như: RTMP, HLS, và HDS
Bạn thấy bài viết này như thế nào?
0 reactions

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher