Tìm kiếm trên dữ liệu qua một số dịch vụ siêu nhỏ


12

Tôi có dữ liệu cho một miền nhất định được phân phối giữa microservice và cơ sở dữ liệu cũ. Tôi có một tìm kiếm mở rộng các trường trên cả cơ sở dữ liệu kế thừa và microservice. Trước đây (trước khi chia microservice), nó đã được thực hiện với truy vấn 1 sql. Bây giờ tôi cần một cuộc gọi REST và truy vấn cơ sở dữ liệu cũ để phục vụ chức năng tìm kiếm này. Chúng tôi đang nói về một vài triệu hàng ở đây. Làm thế nào tôi có thể mô hình này tốt nhất? Do khối lượng dữ liệu, cuộc gọi REST thường trả về kết quả phân trang. Cách tiếp cận ngây thơ để thực hiện cuộc gọi SQL và kết hợp và hợp nhất các kết quả với phản hồi REST quá chậm và không thực tế.

Câu trả lời:


20

Một tính năng tìm kiếm có thể được mô hình hóa như một dịch vụ riêng biệt với trách nhiệm riêng biệt từ hai dịch vụ bạn đề cập. Vì vậy, cách tiếp cận ở đây có thể là tạo một dịch vụ mới ('tìm kiếm') và lưu trữ bản sao dữ liệu từ cả hai dịch vụ ở dạng dễ lập chỉ mục và tìm kiếm, cũng có thể được chuẩn hóa để nhanh chóng đưa ra kết quả định dạng mong muốn.

Vì vậy, ví dụ, bạn có thể có cơ sở dữ liệu SQL kế thừa bằng cách sử dụng ví dụ mySql, microservice khác sử dụng, ví dụ MongoDB và dịch vụ tìm kiếm mới sử dụng elaticsearch với dữ liệu từ cả hai đã được dán cùng nhau (không chuẩn hóa) để truy cập thuận tiện hơn. tất nhiên các chi tiết sẽ phụ thuộc vào loại tìm kiếm bạn cần thực hiện.

Dữ liệu từ hai dịch vụ tốt nhất sẽ được chuyển không đồng bộ đến chỉ mục tìm kiếm thông qua một xe buýt sự kiện như Kafka hoặc Hermes để tăng thông lượng và giảm khớp nối giữa các dịch vụ. Một sự thay đổi trong bất kỳ một trong hai dịch vụ sẽ gửi một sự kiện thông báo cho dịch vụ tìm kiếm cũng cập nhật dữ liệu của nó.

Tất nhiên, có chi phí cho một sự chậm trễ bổ sung giữa các thay đổi trong dịch vụ và trong dịch vụ tìm kiếm, nhưng vì microservice thường được sử dụng trong các hệ thống được phân phối, nên một số độ trễ và sự không nhất quán tạm thời là không thể tránh khỏi. Có một dịch vụ bổ sung và sử dụng thêm dung lượng lưu trữ cho một bản sao dữ liệu đã có trong hai dịch vụ kia cũng là một chi phí điển hình của việc có một hệ thống phân tán và có khả năng mở rộng cao bằng cách sử dụng microservice.


Tôi đã mặc dù về việc tạo ra một dịch vụ riêng biệt. Điều duy nhất mang lại cho tôi một số khó chịu - tạo một cơ sở dữ liệu khác chỉ để tìm kiếm (cung cấp cho nó đàn hồi sẽ là một lựa chọn khác, nhưng chúng tôi có một số điểm nghẽn cơ sở hạ tầng)
giác giác

7
@zencv Thật không may, microservice đi kèm với chi phí như thế này. Có thể mở rộng theo chiều ngang có nghĩa là khớp nối cần phải yếu và điều này có nghĩa là thường sẽ có sự trùng lặp dữ liệu. Bạn cũng nhận được nhiều lưu lượng mạng hơn. Khả năng mở rộng thường có nghĩa là giảm hiệu suất trên mỗi đơn vị phần cứng và chọn một kiến ​​trúc trên một kiến ​​trúc khác (ví dụ microservice so với nguyên khối) phải tính đến sự đánh đổi này.
Michał Kosmulski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.