Gửi em, trong một chiều xuân nắng vàng...

Em à, hôm nay đã là ngày nghỉ Tết cuối cùng của năm Kỷ Hợi. Thời gian trôi nhanh thật đấy? Thấm thoắt thoi đưa, ấy vậy mà đã gần một năm mình quen nhau. Một năm, với bao vui buồn hờn tủi, anh có em cùng đồng hành.

Còn nhớ ngày ấy, anh mới chỉ là một cậu sinh viên chân ướt chân ráo được gọi vào đội phần mềm tại Techmaster. Dù qua đào tạo bài bản, nhưng khi tiếp xúc với thực tế, anh thấy mình còn non lắm. Ngỡ ngàng và dè dặt là những từ mô tả anh khi ấy. Nhưng môi trường làm việc tại Techmaster thoải mái lắm em ạ. Mọi người quan tâm và giúp đỡ lẫn nhau. Tại đây, anh đã học được rất nhiều điều. Anh luôn muốn cảm ơn Techmaster vì đã những bài học quý giá đó. Và vì ... đã cho anh cơ hội được gặp em.

Em có biết, ở đời gặp được nhau đã là một cái “duyên”? Vậy nên chúng mình rất có duyên đó. Khi anh đang theo lối mòn quen tay viết api CRUD, boss đã bảo anh rằng: “Anh thấy chú có vẻ chán chán. Anh sẽ giới thiệu cho chú một người cực thú vị. Nhưng cô này hơi khó hiểu. Chinh phục được hay không tự dựa vào sức chú.” Con trai FA đã lâu, lại là dân kỹ thuật nên khi nghe vậy anh rạo rực lắm. Cảm giác như có dòng suối mát bất chợt chảy qua cõi lòng vốn đã khô quạnh. Từ đó, anh cất công lên mạng dò la tin tức về em.

  • Họ tên: Event sourcing
  • Ngày sinh: 12/12/2005
  • Gia đình: Một thành viên của Further Enterprise Application Architecture development
  • Cha đẻ: Martin Fowler
  • Sứ mệnh khi đến với Trái Đất: Đảm bảo mọi sự thay đổi trạng thái của đối tượng đều được lưu trữ dưới dạng một chuỗi các sự kiện
  • Siêu năng lực: điều khiển dòng thời gian (trình diễn lịch sử thay đổi của đối tượng, từ đó dựng lại các trạng thái của đối tượng trong quá khứ)

Mới đầu, anh cứ ngỡ em cũng giống như cô bạn gái cũ Audit Log, chuyên gia gián điệp ghi chép lại mọi sự kiện. Nhưng không, em bí ẩn hơn nhiều. Khả năng của em là sức hút không thể khước từ đối với một hệ thống E-learning cần sự chặt chẽ và chính xác từ khâu giao dịch đến quản lý lớp học, khóa học, ... Rõ ràng, anh đã bị em thu hút. Nhưng anh biết con đường để tiếp cận và hiểu em sẽ không dễ dàng. Nếu người ta đọc Đắc nhân tâm để hiểu tâm lý một người, thì anh lựa chọn đọc Domain Driven Design để hiểu em. Sách viết bằng tiếng Anh dài gần nghìn trang, đã có lúc anh mệt mỏi và muốn dừng lại. Đã có những cuộc tranh luận tranh luận nảy lửa trong team để hiểu rõ thực sự “em là ai”. Là “người lạ ơi có thể cho team mượn một bờ vai, mượn rồi sẽ trả” hay bạn “tri kỉ” gắn bó dài lâu. Và cuối cùng team của anh kết luận rằng “thương em là điều không thể ngờ”.

Em - Event Sourcing luôn tâm niệm trong đầu một quan điểm sống: Mọi thứ đều xoay quanh Aggregate. Đối với em, aggregate không nhất thiết phải ánh xạ từ một bảng vậy lý, mà nó thể hiện một đối tượng hoàn chỉnh, có thể tồn tại độc lập. Ví dụ như học viên, lớp học, khóa học, profile của user, lịch sử giao dịch của học viên … đều có thể trở thành aggregate. Một aggregate sẽ chịu tác động của nhiều event. Và sứ mệnh của em chính là cất giữ tất cả những event đó vào một cái nơi chỉ cho phép thêm vào (insert) chứ không được rút ra (delete) hay chỉnh sửa (update), nơi đó được gọi là event store. Công việc yêu thích của em là đánh version tăng dần cho mỗi event trước khi lưu trữ. Việc tưởng chừng đơn giản mà lại mang một ý nghĩa lớn lao. Nhờ đó mới có thể lấy ra dòng lịch sử thay đổi aggregate theo thời gian chính xác, playback trạng thái của aggregate đến bất cứ mốc nào trong quá khứ.

Em tốt vậy, mà nhiều lúc anh lại trách lầm em. Anh trách sao em cứ mãi ngốc chụp đi chụp lại trạng thái của aggregate làm gì trong khi đã lưu lại tất cả các event. Khi có một event mới, anh lại mất công kiểm tra xem số lượng event hiện tại đã vượt quá số lượng định mức chưa (tự quy định) để lưu lại trạng thái của aggregate tại thời điểm đó. Sau này, anh mới biết đó gọi là snapshot. Snapshot được sử dụng để tránh trường hợp phải liên tục replay lại từ đầu tất cả các event xảy ra đối với một aggregate. Nhưng em này, không có những khoảnh khắc như vậy thì mình đã không hiểu nhau hơn và cùng tay trong tay vượt mọi deadline phải không?

Về cơ bản, em rất dễ tính. Chỉ cần sử dụng hai bảng lưu trữ trong database là đủ.

Bảng event_store

Bảng event_store

Bảng snapshot 

Bảng snapshot

Nhưng để implement em là một điều không dễ dàng. Thú thực, anh đã thao thức bao đêm không ngủ. Là vì em đó. Nhân đây gửi cho các anh em tham khảo Source code Golang kèm tấm ảnh chân dung em. 

 

Thôi thư đã dài, anh xin dừng bút tại đây. Năm mới rồi, dự án cũng đến hồi kết thúc. Không thể bước mãi cùng em được nhưng anh mãi xem em như một trải nghiệm đẹp trong đời coder, dù mai này có thể anh sẽ gặp những "cô gái" tốt hơn. Cảm ơn em, Event Sourcing. 

P/s: Thư mang tính chất PR cho Event Sourcing. Có thể mình viết hơi khó hiểu và hời hợt chưa đủ toát lên vẻ đẹp của em nó. Do vậy các bạn có thể tham khảo thêm nhiều bài viết khác về Event Sourcing trên blog Techmaster.  Hãy cứ bước đi, tìm hiểu và trải nghiệm. Biết đâu bạn sẽ gặp được tri kỉ như mình đã từng.