Integrating Neo4j Into Your Stack

Bài tóm tắt Doximity 2022 2. Tăng trưởng Độ khó: Trung bình

Doximity · 2022 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Doximity là mạng nghề nghiệp cho bác sĩ; câu hỏi kiểu "hai user nối với nhau thế nào", "bạn cấp 1 hay 2", "đồng nghiệp chung" khó hoặc chậm trên SQL. Họ dùng Neo4j cho đồ thị quan hệ, cạnh ứng dụng Rails.
  • Trước đây ghi vào Neo4j nằm trong luồng web: upsert node lỗi thì rollback cả transaction web của user.

Thay đổi chính

  • Đọc đồng bộ, ghi bất đồng bộ. Client đọc thẳng Neo4j qua HTTP API (gem dùng chung chứa mọi query Cypher và test). Ghi đi qua Kafka: callback after_commit của ActiveRecord publish message, một service riêng consume rồi upsert vào Neo4j. Neo4j sập thì user không bị ảnh hưởng, chỉ trễ nhất quán.
  • Ép luồng bằng access mode: gem luôn gửi header READ nên mọi câu lệnh ghi từ client bị Neo4j từ chối; chỉ service consumer gửi WRITE. Cụm tối thiểu 3 node (1 leader nhận ghi, 2 follower đọc), giới hạn thread để ghi dồn không đè leader.
  • Upsert idempotent bằng MERGE trên UUID, vì có thể reset offset và replay cả topic.
  • Thứ tự đến lệch: quan hệ AUTHOR_OF có thể tới trước node User/Publication; khi đó tạo node "stub" chỉ có UUID, message đầy đủ tới sau sẽ upsert thêm thuộc tính. Bỏ qua quan hệ khi thiếu node thì mất quan hệ.
  • Compacted topic theo khoá UUID: message phải là trạng thái đầy đủ chứ không phải diff; consumer group mới đọc lại toàn bộ trạng thái mà không cần backfill; tombstone xoá bản ghi đã xoá. Avro + schema registry làm hợp đồng; unique constraint trên UUID làm lưới an toàn.
  • Dùng UUID thay ID tự tăng khi dữ liệu qua ranh giới ứng dụng.

Vì sao

  • Kho thứ hai cho một workload riêng (đồ thị) không được làm hỏng đường ghi chính; đưa nó ra sau một hàng đợi biến lỗi của kho phụ thành độ trễ.

Bài học cho SWE

  • Thêm DB chuyên dụng cạnh DB chính: ghi qua event, đọc trực tiếp, và chấp nhận nhất quán trễ một cách tường minh.
  • Consumer phải idempotent và chịu được thứ tự lệch giữa các topic; "stub rồi bổ sung" là cách đơn giản cho đồ thị.
  • Compacted topic + message trạng thái đầy đủ biến Kafka thành nguồn dựng lại kho phụ.

Liên quan