1. Về Khái niệm EDA
EDA (Event-driven architecture) - Kiến trúc hướng sự kiện: thực chất là 1 mẫu/kỹ thuật thiết kế, xây dựng phần mềm theo hướng sự kiện, trong đó về cơ bản, phần mềm được xây dựng xung quanh các thao tác như tạo (event producer), khám phá, tiêu thụ (event comsumer) và đáp trả lại các sự kiện (event). Hiểu đơn giản hơn, EDA là một kiểu thiết kế phần mềm được xây dựng trên luồng các event, sử dụng event như là phương tiện giao tiếp giữa các thành phần hệ thống. Một event trong EDA được hiểu là một "thay đổi trạng thái đáng chú ý” của một thành phần nào đó trong hệ thống. Event có thể được phát sinh do người dùng, do các thiết bị phần cứng hoặc do chính phần mềm phát sinh trong một điều kiện nào đó.
EDA được xem như một trong những kĩ thuật thiết kế hiệu quả để xây dựng các kiến trúc ứng dụng có hiệu suất cao, có thể mở rộng, có khả năng phục hồi và kết hợp lỏng lẻo (hạn chế đến mức nhỏ nhất quan hệ phụ thuộc giữa các thành phần hệ thống hay các module, cơ chế giao tiếp giữa các module là cơ chế tương tác không đồng bộ bằng cách sử dụng các event).
EDA là một khái niệm không quá mới, đã được các hãng như IBM, TIBCO đưa EDA trong các giải pháp Middleware của họ. EDA còn được sử dụng rộng rãi trong các framework phổ biến như Cairngorm, PureMVC...(PureMVC là một framework được sử dụng để phát triển các ứng dụng dựa trên kiến trúc MVC - (Model View Controller), PureMVC tồn tại trong nhiều ngôn ngữ như Java, ActionScript, PHP,… và hiện khá phổ biến ỏ Việt Nam).
Ví dụ về EDA:
- Người dùng A chuyển tiền liên ngân hàng cho người dùng B ở ngân hàng khác, người dùng A nhận được được sms/email thông báo chuyển tiền thành công, tuy nhiên người dùng A không cần phải biết sự kiện người dùng B ở ngân hàng khác kia đã nhận được tiền lúc nào.
- Khi cổ phiếu xuống giá quá thấp, một lệnh trigger bán để nhà đầu tư tránh bị cháy tài khoản kích hoạt.
Trong ví dụ ở trên, một quy trình nghiệp vụ được bắt đầu, dừng lại hoặc thay đổi dựa trên một sự kiện hoặc một chuỗi sự kiện. Khả năng mô hình hóa/tự động xử lý sự kiện thực tế trong phần mềm có ý nghĩa quan trọng đối với các tổ chức để đạt được hoạt động kinh doanh hiệu quả hơn, đáp ứng yêu cầu của khách hàng và đối tác.
2. SOA và Advanced SOA là gì?
SOA (Service Oriented Architecture) – Kiến trúc hướng dịch vụ - là một phong cách kiến trúc phần mềm, một ý tưởng hoặc cách tiếp cận về cách thức thiết kế phần mềm cung cấp các tính năng, tiện ích dưới dạng các dịch vụ. SOA giúp tăng tốc độ và tính linh hoạt cho các tổ chức CNTT trong việc đáp ứng các thay đổi về yêu cầu nghiệp vụ. SOA cho phép tái sử dụng ứng dụng và dữ liệu trong các quy trình nghiệp vụ, giúp cho đội ngũ xây dựng phần mềm hoàn thành nhiều dự án hơn, giảm tồn đọng, mang lại giá trị bổ sung cho doanh nghiệp.
Advanced SOA (Traditional SOA + EDA, đôi khi được gọi là “SOA 2.0”, Event-Driven SOA), là một phiên bản hoàn thiện hơn của khái niệm ban đầu về SOA. Sự khác biệt cơ bản là Advanced SOA bổ sung thêm EDA vào mô hình SOA truyền thống (tương tác hỏi/đáp - request/reply interactive business service model). Việc kết hợp, bổ sung xử lý hướng sự kiện vào mô hình SOA truyền thống sẽ cung cấp cho hệ thống có khả năng nhận và xử lý các sự kiện nghiệp vụ nhanh chóng, thông qua quy trình tự động hoặc tương tác của con người.
Theo bài viết của tư vấn Gartner (báo cáo năm 2007): SOA và EDA phải được hiểu rõ trước khi chúng có thể được sử dụng cùng nhau. Advanced SOA đặt ra các yêu cầu đối với môi trường chạy ứng dụng (runtime midleware) và các công cụ phát triển trong các lĩnh vực như bảo mật, hiệu suất, tính toàn vẹn và quản lý hệ thống. Các thành phần đóng vai trò là người tiêu dùng hoặc nhà cung cấp dịch vụ, hoặc nguồn sự kiện (Event Source) hoặc phần chìm (Event Sink), hoặc một số kết hợp của những thành phần này phải được phát triển và quản lý thông qua mô hình siêu dữ liệu chung, nhất quán và triển khai phần mềm trung gian (midleware). Một số hỗ trợ này hiện được cung cấp bởi các sản phẩm ESB và bộ tích hợp hàng đầu, nhưng cần phải được hỗ trợ hơn nữa trước khi các dự án phần mềm chính thống có thể tham gia một cách an toàn vào thực tiễn này theo cách thức dựa trên tiêu chuẩn, chi phí thấp.
Trong kiến trúc Advanced SOA, EDA được dùng như phương tiện giao tiếp giữa các dịch vụ SOA, cho phép người dùng theo dõi, phân tích, làm giàu các sự kiện để tạo được mối liên hệ giữa các sự kiện mà ban đầu không có mối liên quan trực tiếp giữa chúng. Điều này giúp cho hệ thống có khả năng tự động hóa các thao tác để giải quyết nghiệp vụ.
Trong hầu hết các trường hợp, tương tác giữa SOA và EDA được thiết kế riêng biệt, được tạo ra bằng các công cụ riêng biệt và sử dụng môi trường chạy (runtime middleware) riêng biệt. Advanced SOA xuất hiện thông qua sự phát triển của phần mềm trung gian (middleware) và các công cụ phát triển hỗ trợ hai phong cách thiết kế theo cách nhất quán, thống nhất và tích hợp hơn. Các trục tích hợp (ESB) đã hỗ trợ các tương tác và thông báo kiểu EDA qua một phần mềm trung gian truyền tải chung và công cụ thiết kế cũng hướng tới thiết kế kết hợp các sự kiện (event) và dịch vụ (service).
Các doanh nghiệp hoạt động dựa trên một loạt các sự kiện và quy trình để phục vụ khách hàng. Do vậy, Advanced SOA đã mang đến một phong cách kiến trúc mới bằng sự kết hợp kiến trúc SOA tương tác theo hướng theo yêu cầu (Request-Driven Service) cùng với các dịch vụ tương tác theo hướng sự kiện (Event-Driven Servcice) nhằm cải thiện tính linh hoạt của doanh nghiệp, khả năng tái sử dụng và cuối cùng là sự nhanh nhẹn (Agility).
Tương tác trong hệ thống SOA và EDA:
Hình 1 – Tương tác SOA và EDA
- Các event trong EDA vận chuyển dữ liệu nghiệp vụ và trạng thái quy trình giữa các service SOA
- Các service SOA chuyển đổi dữ liệu nghiệp vụ và trạng thái quy trình.
- Các service SOA được chia tách bởi các event trong EDA
- Service SOA có thể tạo ra hoặc sử dụng các event trong EDA
- Service SOA phải có khả năng xác định xác sự kiện và tiến thực hiện các thao tác cần thiết.
- Cả các event và service đóng vai trò là thành phần chính trong trục tích hợp.
3. Về việc triển khai Advanced SOA (kết hợp SOA và EDA) trong kiến trúc ứng dụng
Kiến trúc Advanced SOA là sự kết hợp giữa SOA và EDA, giúp cho hệ thống có khả năng tự động hóa các thao tác để giải quyết nghiệp vụ. Trong môi trường hoạt động CNTT, EDA là một mô hình xử lý các sự kiện phát sinh khi thực hiện nghiệp vụ hoặc sự kiện phát sinh trong các hệ thống công nghệ thông tin nhằm thực thi một dịch vụ/quy trình nghiệp vụ nào đó liên quan đến các sự kiện này như quảng bá, bán chéo sản phẩm đến khách hàng, phòng chống gian lận, gửi sao kê, gửi cảnh báo giao dịch nghi ngờ (giao dịch nghi ngờ bị thực hiện sai loại tiền..), thực thi các dịch vụ tự động cung cấp cho khách hàng.
Qua thực tế tại các hệ thống ứng dụng CNTT cho thấy, chúng ta nên tiếp tục triển khai các bài toán sử dụng EDA kết hợp cùng SOA, vì kiến trúc lỏng là xu hướng phù hợp có các bài toán CNTT, do có quá nhiều thành phần và việc phát triển ứng dụng nên theo hướng này để có kiến trúc rõ ràng rành mạch, việc phát triển ứng dụng thuận lợi, bảo trì dễ dàng (tránh kiến trúc một khối hoặc kiến trúc có các thành phần gắn chặt với nhau dẫn đến việc chỉnh sửa một thành phần lại gây ảnh hưởng lớn đến các phần khác). Khi phân tích thiết kế mỗi bài toán nghiệp vụ, nhóm thiết kế, kiến trúc sẽ phân tích, xem xét việc áp dụng các mẫu thiết kế (patterns) kiến trúc (như SOA, EDA, Microservice, Client Server, …) và có thể kết hợp các pattern lại với nhau để đem lại hiệu quả thiết kế tối ưu.
4. Áp dụng Event Driven với giải pháp Apache Kafka
Apache Kafka là một nền tảng streaming phân tán, có khả năng xử lý hàng tỷ sự kiện mỗi ngày. Kafka có khả năng truyền một lượng lớn message theo thời gian thực, trong trường hợp bên nhận chưa nhận message thì nó vẫn đượuc lưu trữ sao lưu trên hàng đợi và trên ổ cứng để đảm bảo an toàn. Bên cạnh đó Kafka cũng có khả năng replicate trong cụm cluster để phòng tránh việc mất dữ liệu.
Bản chất Kafka cũng là một hệ thống message public/subcribe phân tán. Trong đó bên public dữ liệu gọi là producer, bên subcribe dữ liệu gọi là consumer, còn Kafka đóng vai trò borker: các ứng dụng (producer) sẽ gửi các message (records) tới node Kafka (broker), những message này sẽ được xử lý bởi các ứng dụng khác gọi là consumer.
Hình 2: mô tả cấu trúc hệ thống kafka đơn giản
Các message được gửi tới kafka node sẽ được lưu trong một nơi gọi là topic, sau đó các consumer có thể subcribe tới các topic đó và lắng nghe, nhận, xử lý các message này. Message có thể là bất cứ thông tin gì như giá trị cảm biến, hành động người dùng…
Với định nghĩa trên thì việc sử dụng mô hình Kafka trong kiến trúc Event-driven giống với thông tin về việc sử dụng kiến trúc EDA trong phần mềm ứng dụng. Trong Kafka, một Topic có thể được forward sang nhiều Topic hoặc Queue khác với các điều kiện lọc kèm theo để các ứng dụng sử dụng Topic – Queue tùy chọn này.
Các thành phần chính trong Kafka gồm 4 thành phần khác nhau như sau:
- Kakfa Broker: Kafka cluster là một set các server, mỗi một set này được gọi là 1 broker
- Zookeeper: đóng vai trò là nơi lưu trữ dữ liệu phân tán dạng key-value. Nó được tối ưu hóa cho tác vụ đọc nhanh nhưng ghi chậm. Kafka sử dụng Zookeeper để thực hiện việc bầu chọn leader của Kafka broker và topic partition. Zookeeper cũng được thiết kế cho khả năng chịu lỗi cao, do đó Kafka phụ thuộc khá nhiều vào Zookeeper.
- Producer: Kafka lưu, phân loại message theo topic, sử dụng producer để publish message vào các topic. Dữ liệu được gửi đển partition của topic lưu trữ trên Broker.
- Consumer: Kafka sử dụng consumer để subscribe vào topic, các consumer được định danh bằng các group name. Nhiều consumer có thể cùng đọc một topic.
Apache Kafka có các khả năng như sau:
- Cơ chế publish/subcribe tương tự như các hệ thống message queue doanh nghiệp khác. Với vai trò producer, Kafka lưu, phân loại message theo topic, sử dụng producer để publish message vào các topic. Với vai trò consumer, Kafka sử dụng consumer để subscribe vào topic, các consumer được định danh bằng các group name.
- Cơ chế lưu trữ stream các bản ghi trên nhiều node broker khác nhau, giúp khắc phục lỗi xảy ra. Trong Kakfa, các Topic có thể có kích thước rất lớn, vì vậy không nên lưu tất cả dữ liệu trong một Topic, mà được phân ra thành nhiều partition để bảo toàn và xử lý dữ liệu dễ dàng hơn. Một Topic có thể có một hay nhiều partition. Trên mỗi partition thì dữ liệu lưu trữ cố định và được gán cho một ID gọi là offset. Trong một Kafka cluster thì một partition có thể replicate (sao chép) ra nhiều bản. Trong đó có một bản leader chịu trách nhiệm đọc ghi dữ liệu và các bản còn lại gọi là follower. Khi bản leader bị lỗi thì sẽ có một bản follower lên làm leader thay thế. Nếu muốn dùng nhiều consumer đọc song song dữ liệu của một topic thì topic đó cần phải có nhiều partition.
- Xử lý stream các bản ghi ngay khi nó vừa đến.
Các ứng dụng có thể sử dụng Kafka như sau:
- Sử dụng như một hệ thống message queue thay thế cho ActiveMQ hay RabbitMQ
- Website Activity Monitoring: theo dõi hoạt động của website
- Stream Processing: Kafka là một hệ thống rất thích hợp cho việc xử lý dòng dữ liệu trong thời gian thực. Khi dữ liệu của một topic được thêm mới ngay lập tức được ghi vào hệ thống và truyền đến cho bên nhận. Ngoài ra Kafka còn là một hệ thống có đặc tính duribility dữ liệu có thể được lưu trữ an toàn cho đến khi bên nhận sẵn sàng nhận nó. Đặc tính này tương tự như trong Topic của TIBCO cũng có tùy chọn này.
- Log Aggregation: tổng hợp log
- Metrics Collection: thu thập dữ liệu, tracking hành động người dùng như các thông số như page view, search action của user sẽ được publish vào một topic và sẽ được xử lý sau
- Event-Sourcing: Lưu lại trạng thái của hệ thống để có thể tái hiện trong trường hợp system bị down.
Apache Kafka là công cụ phổ biến với các nhà phát triển vì nó dễ sử dụng, cung cấp nền tảng xử lý kiện hoàn chỉnh và mạnh mẽ với các API cung cấp sẵn: Producer, Consumer, Streams và Connect. Thông thường, người lập trình sẽ bắt đầu sử dụng Kafke cho các bài toán điển hình như làm hệ thống buffer lưu message để giảm workload cho database, sử dụng Connect API để đồng bộ liên tục với CSDL, xử lý dữ liệu khi nhận được với Streams API và tổng hợp cho ứng dụng .
Nhìn chung, Apache Kafka và các API giúp cho việc xây dựng các ứng dụng theo kiến trúc Event-driven và quản lý các hệ thống back-end phức tạp. Kafka giúp cho người dùng yên tâm hơn khi dữ liệu hệ thống luôn có khả năng chịu tải, chịu lỗi, có thể phát lại được và cung cấp theo thời gian thực. Kafka cũng giúp người sử dụng nhanh chóng xây dựng ứng dụng bằng một nền tảng duy nhất để xử lý, lưu trữ, kết nối các ứng dụng và hệ thống với dữ liệu thời gian thực.
Hình 3: mô tả sử dụng Kafka để xử lý, nhận message chỉ với vài dòng lệnh
Một điểm mạnh nữa ngoài việc cho phép triển khai hệ thống theo mô hình cluster để đảm bảo tính an toàn cho hệ thống, Kafka cũng hỗ trợ cài đặt và sử dụng trên các môi trường cloud , ví dụ như Amazon Web Services. Hệ thống AWS (Amazon MSK) sẽ giúp người dùng dễ dàng collect và xử lý dữ liệu truyền trực tiếp realtime bằng Apache Kafka.
Đối với hệ thống BPM hoặc tự động hóa quy trình, người dùng có thể tạo quy trình nghiệp vụ nhận và gửi Kafka message theo những cách sau:
- Tạo các loại message sự kiện bắt đầu quy trình, sự kiện mà quy trình nhận được, hoặc sự kiện trong khi Activity đang thực hiện (Boundary Event). Thông báo sẽ trigger sự kiện, node sự kiện sẽ đóng vai trò consumer sử dụng message và gửi chuyển tiếp message đến các nút tiếp theo trong quy trình.
- Tạo các loại message sự kiện kết thúc quy trình, sự kiện mà quy trình sinh ra, message dữ liệu được cấu hình trong sự kiện, nốt sự kiện đóng vai trò producer, tạo ra các thông báo.
Người sử dụng có thể cài đặt Kafka ở môi trường nội bộ hoặc trên Cloud. Hãng cũng khuyến cáo người sử dụng nên chạy các worker Kafka Connect trên cùng nền tảng OpenShift Container. Mặc dù đây là phần mềm mã nguồn mở nhưng với những khả năng, độ phổ biến của Kafka, người dùng có thể yên tâm sử dụng trong các hệ thống lớn. Những lợi ích mà Kafka đem lại bao gồm:
Khả năng mở rộng: mô hình partition Kafka cho phép phân phối các Topic trên nhiều máy chủ và thu hồi khi không còn phù hợp. Các Topic được chia nhỏ sẽ làm giảm dung lượng thay vì 1 Topic chứa toàn bộ message của 1 bảng.
Nhanh: Do Kafka cho phép xử lý tách các luồng dữ liệu, vì thế độ trễ rất thấp làm cho tốc độ trở nên nhanh hơn.
Khả năng chịu lỗi và độ bền: Các gói dữ liệu message có thể được replicate và phân phối trên nhiều server khác nhau. Vì thế, khi có một sự cố xảy ra, dữ liệu vẫn đảm bảo không bị lỗi hoặc mất. Trong kiến trúc Kafka có các worker làm nhiệm vụ sau:
- Fault tolerant: nếu một worker gặp sự cố, task của worker đó sẽ được assign sang cho các worker khác để tiếp tục thực thi.
- Self managed: trong trường hợp có worker mới join vào cluster, các task sẽ được phân phối lại để đảm bảo load balance.
Cách thức kết nối vào hệ thống Kafka đơn giản, không phức tạp, cán bộ lập trình dễ dàng xây dựng các client kết nối.
Đỗ Tiến Thành
Nguồn tham khảo:
- https://www.researchgate.net/publication/3426877_Service-Oriented_Architecture_and_Web_20
- https://www.researchgate.net/figure/An-approach-for-the-integration-of-IoT-SOA-20-and-CEP_fig1_261877904