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_commitcủ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
MERGEtrên UUID, vì có thể reset offset và replay cả topic. - Thứ tự đến lệch: quan hệ
AUTHOR_OFcó 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
- Event-driven, message queue và Kafka · Chọn database theo workload
- Cùng công ty: Doximity 2022 (nền tảng Kafka cho Ruby) · Doximity 2026
- Cùng bài toán graph DB: PayPal 2021
#Neo4j#graph database#Rails#Kafka#after_commit#idempotent upsert#MERGE#stub node#compacted topic#tombstone#Avro#leader/follower
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (1)