Tag Archives: Datomic

Datomic time travel query กับ schema migration

Datomic เป็น database ที่เราสามารถ query จากสถานะของ database ในอดีตได้ เช่น query กับ database ขณะที่ data เป็นเมื่อ 3 อาทิตย์ก่อน ผมเคยมีข้อสงสัยกับคุณสมบัตินี้ว่ามันจะเวิร์คจริงหรอ เช่น ถ้าเราเอาโค้ดปัจจุบันไป query data ในอดีต หรือโค้ดในอดีตที่เรา revert กลับไป ไป query กับ database ปัจจุบันได้เสมอมั้ย (ถ้าใครเคยเขียน Rails อาจจะเคยเจอกรณีที่เมื่อ codebase ของเรา evolve ไปซักพัก เราจะไม่สามารถรัน migration ตั้งแต่ต้นได้ เพราะ model ของเรามีการเปลี่ยนแปลงไปจากวันที่เขียน migration นั้นๆ) หรือเราต้องมีการ sync code กับ database แต่ละช่วงเวลาหรือเปล่า

วันนี้ผมได้คำตอบแล้ว หลังจากได้ฟังคำอธิบายของ David Nolen จากช่วง AMA ของเขาในงาน ReactiveConf 2017

Continue reading

Advertisements

ธนาคารยุคใหม่ในบราซิลใช้ Datomic เป็นอาวุธลับสู้กับธนาคารดั้งเดิม

มี experience report/advertisement ออกมาว่า startup ธนาคารเจ้าหนึ่งใน Brazil ที่ชื่อว่า Nubank เลือกใช้ Datomic เป็น database หลักในระบบ NUBANK USES DATOMIC TO SHAKE UP THE BANKING INDUSTRY IN BRAZIL

(Datomic คือ database ที่ถูกสร้างโดยผู้สร้าง Clojure ใช้แนวความคิดหลักเดียวกัน คือ สิ่งที่ write ลงไปแล้วจะไม่สามารถลบได้ สามารถค้นประวัติการ write ออกมาได้หมดในเวลาที่รวดเร็ว ประเด็นหลักที่ทำให้มันไม่เป็นที่รู้จัก น่าจะเป็นเพราะมันไม่ open source)

อ่านดูแล้วรู้สึกมันน่าสนใจมาก เลยไปดู talk ที่ตัวแทนจากทีม Engineer ของ Nubank เล่าให้ฟังเกี่ยวกับการใช้ Datomic ของเค้า

สรุปเนื้อหาคร่าว ๆ ได้ดังนี้

ทีมเริ่มคิดจากกระดาษเปล่า ระดมความคิดว่าจะใช้ tech อะไรดีทำระบบธนาคารยุคใหม่ดี พบ Datomic ก่อน จึงทำให้รู้จัก Clojure ด้วย

  1. Audit Trail – แป๊ะ metadata เข้าไปที่ data ได้ สามารถ query ด้วยเงื่อนไขบน metadata ได้ ไม่มีการโดนลบ
  2. Authorization
    – recursive rule ใช้ช่วย query เมื่อต้องขุด entity relationship หลายๆ ทอด ตัวอย่างของเค้าคือ หาว่าสามารถ show comment หนึ่งๆ ให้ user ดูได้มั้ย
    – database is value สามารถ filter ค่าจาก database ได้เหมือนเป็น collection อันนึง เค้าใช้ช่วยในการ scope data permission
  3. HTTP Cache – สามารถ query ได้ง่ายว่า data มีการเปลี่ยนแปลงจาก request ที่แล้วหรือเปล่า ถ้าไม่เปลี่ยนก็ return HTTP 304 ทันที
  4. Mobile Sync – ใช้การ query history ด้วยเวลาช่วยในการดึง data เฉพาะที่ mobile client ยังไม่มี
  5. Future DBs – สร้าง data ที่ยังไม่เป็นจริงในปัจจุบัน แต่จะเป็นจริงในอนาคต ใช้ช่วยแก้ปัญหาการ charge เงินในอนาตค
  6. Testing – database is value แปลว่าในขณะ test สามารถแทนที่ database ด้วย collection ของ data ธรรมดาได้เลย
  7. Schema Extension – เค้าทำการเพิ่ม schema เข้าไปใน database แล้วเขียน hook เข้ากับ field ใหม่เพื่อทำการ encrypt customer name โดยไม่กระทบกับสิ่งที่ engineer คนอื่นๆ ทำอยู่
  8. Sharding Reads – datomic จัดการ query cache ของแต่ละ shard ให้ และจัดการการเปลี่ยนแปลงแบบ transaction บนหลาย shard ให้ด้วย
  9. Db Aggregation – ถ้ามีหลาย database แล้วทีม analytic ต้องการ aggregate data ก็แค่ระบุ database ทั้งหมดที่ต้องการดึงข้อมูลลงไปใน query