Tại sao 2 server, 2 hệ thống giao tiếp với nhau qua file

Dear all,

Em thấy một số hệ thống giao tiếp với nhau theo kiểu định kỳ như thế này:

  • Server A xuất data muốn gửi vào file và lưu file này tại path X.
  • Server B muốn lấy data thì định kỳ cứ mỗi 1 giờ B vào X để lấy file.

Em có thắc mắc là:

  • Tại sao phải làm như vậy? không được realtime nữa, tại sao không triển khai theo kiến trúc web service?
  • Mỗi khi B vào A lấy file thì B có báo với A để A xóa không?
  • Tại path X, A xóa rồi tạo file mới hai ghi tiếp vào file cũ?
  • B có bị trùng data không?

Em từng thấy cách làm này ngoài thực tế là trường hợp bác sĩ gọi số thứ tự bệnh nhân, số thự tự thì chạy realtime ở service HIS (tên hệ thống quản lý bệnh viện). Bài toán đặt ra là làm sao để hiển thị số này trên màn hình led? Ông dev HIS đưa enpoint restful API cho ông dev màn led bảo:
– API nè call đi, socket nè ông listening đi!
Ông dev màn led bảo:
– Tôi không biết gì về web service cả, màn led này không tạo request htttp, ws được. Thôi thì ông tạo file STT.txt trong ổ C máy y tá đi, muốn gửi gì thì ghi vào file STT.txt theo syntax này nè, màn led tôi cắm dây vào máy này. Định kỳ 20s màn led của tôi sẽ vào file này cập nhật STT.


Đây là trường hợp giới hạn về công nghệ, nguồn lực nhưng em vẫn thấy các hệ thống lớn cỡ ngân hàng vẫn dùng cách này (có thể đây nguyên nhân dẫn đến giao dịch bị delay cả ngày vì chưa đến thời điểm server B crawl data từ server A chăng?)

Mong được giải đáp, em cảm ơn

Tại sao phải dùng giao thức HTTP? :smiley:

Vì polling là đơn giản nhất rồi, nếu không yêu cầu bảo mật.

Trước khi A ghi file thì A sẽ khóa file lại không cho B đọc.

5 Likes

bạn thấy thì chắc bạn có một sự liên quan nhất định tới những hệ thống đó, vậy tại sao bạn không hỏi người thiết kế hệ thống?

có cả ngàn lí do có thể kể, người thiết kế kém kĩ thuật, người thiết kế thích như thế, hoặc vì một lý do khách quan mà không làm được như bạn nói, chứ không phải vì năng lực hay kĩ thuật
ở đây ai mà biết ngữ cảnh cụ thể để trả lời được cho bạn

người ta không cần?

tại sao không phải là dùng file? tại phải phải dùng web service?

bạn cho ví dụ về ngân hàng, vậy bạn nghĩ thử xem, nếu dùng web/http thì sẽ có những vấn đề gì phát sinh?

4 Likes

Tớ đoán cậu đang nói tới các hệ thống banking, financial hoặc insurance. Cách triển khai này rất phổ biến trong các hệ thống ở lĩnh vực này. Vậy nên, các câu trả lời dưới đây của tớ sẽ trả lời trên context về domain kể trên.

  • Tại sao phải làm như vậy? không được realtime nữa, tại sao không triển khai theo kiến trúc web service?

Cá nhân tớ không có nhiều kinh nghiệm lắm với domain này, đủ để giải thích chính xác lý do tại sao các hệ thống banking hoạt động theo cách này. Cơ mà, tớ có thể đưa ra một vài phỏng đoán (có thể không chính xác) rằng:

  • Domain banking/insurance/financial hoạt động chủ yếu với các giao dịch tiền tệ.
    Với giao dịch tiền tệ, cậu cần 1 thao tác rất quan trọng, gọi là reconcile (đại khái là cậu cần rà soát, đối chiếu để khớp về mặt số liệu giữa thu và chi).
    Để reconcile, tớ nghĩ các bằng chứng về các lệnh chuyển tiền được ghi lại dưới dạng văn bản (file) là cách để họ so khớp. Đây là cách truyền thống trong lĩnh vực kế toán, và khi digitalize quy trình này, cậu có việc trao đổi file.
  • Ở domain banking/insurance/financial, cậu không nhất thiết phải thực thi realtime như các domain khác.
    1 giao dịch thông thường chỉ cần được hoàn thiện trong ngày giao dịch (T), hoặc sau ngày giao dịch 1 ngày (T+1). Cậu không nhất thiết phải nhanh, nhưng cậu phải chính xác, vì đây là tiền :money_with_wings:
    Một lần nữa, tớ đoán đây là cách truyền thống trước khi có máy tính, và khi digitalize quy trình này, cậu vẫn có “di sản” như vậy, dù về mặt kỹ thuật, cậu hoàn toàn có thể khớp lệnh giao dịch realtime.
  • File với checksum thường đáng tin cậy hơn việc giao tiếp dựa trên HTTP request hay message broker. Cậu có thể sử dụng file với checksum để làm prove khi audit.
  • Mỗi khi B vào A lấy file thì B có báo với A để A xóa không?

Thường thì bên consumer nên là bên xử lý các file sau khi consume, hoặc platform host cho việc file exchange sẽ xử lý việc đó. Cậu không có lý gì để yêu cầu bên publisher phải làm điều đó.
Tất nhiên, nếu cậu có lý do đặc biệt lắm, thì bên publisher mới phải làm việc này.

  • Tại path X, A xóa rồi tạo file mới hai ghi tiếp vào file cũ?

Trong domain banking, cậu thường tạo các folder tương ứng với từng business day, và các giao dịch trong cùng ngày nên được ghi vào chung 1 file, nên về cơ bản, cậu không nên xảy ra việc file trùng tên nhau.
Việc này thường xảy ra 1 lần 1 ngày, nên cậu chỉ có thể ghi vào file mới thôi.
Nếu câu hỏi của cậu không ở domain này, tớ sẽ nói tùy vào business requirement mà cậu có quyết định phù hợp.

  • B có bị trùng data không?

Điều này không nên xảy ra trong domain banking.
Còn trong TH thông thường, nó hoàn toàn có thể xảy ra, và cậu hẳn nhiên cần thiết kế để phòng ngừa TH này.

Hope it helps!

6 Likes

Cách giao tiếp qua file như em và anh library mô tả gọi là polling hả anh?

Polling là một cơ chế kiểm tra sự kiện/dữ liệu theo định kỳ thời gian (ví dụ 5 phút 1 lần). Dùng để phân biệt với cơ chế Event (hoặc là Interrupt), kiểm tra sự kiện/ dữ liệu chỉ khi có sự kiện xảy ra.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?