AWS Kinesis

Trong bài viết này thì mình sẽ giới thiệu về services (chính xác hơn là một chuỗi services) của Amazon có khả năng xử lý luồng dữ liệu stream data rất nhanh, mạnh theo thời gian thực (realtime). Đó là các service thuộc Amazon Kinesis

Amazon Kinesis là gì?

Amazon Kinesis là service giúp bạn xây dựng được một ứng dụng có khả năng phân tích và xử lý luồng dữ liệu (stream data) theo thời gian thực (realtime). Amazon Kinesis có khả năng thu nhận, lưu trữ đến hàng terabytes dữ liệu trong một giờ.

Về cơ bản thì Kinesis cung cấp cho bạn một kênh để dữ liệu được truyền đến các application xử lý một cách dễ dàng tin cậy. Tuy nhiên nó cũng có khả năng lưu trữ khi phía xử lý dữ liệu của bạn bị down và không thể xử lý dữ liệu.

Amazon Kinesis có thể nhận dữ liệu data từ hàng trăm, hàng nghìn nguồn khác nhau như luồng click website (website clickstreams), giao dịch thương mại (financial transaction), mạng xã hội (social media feeds), IT logs... Và tất nhiên là dữ liệu khi được xử lý có thể sử dụng với các service khác của Amazon như là Amazon S3, Amazon Redshift, Amazon Elastic Map Reduce (Amazon EMR), AWS Lambda, AWS DynamoDB...

Hiện tại có 3 service thuồn Amazon Kinesis là:

  • Kinesis Streams
  • Kinesis Firehorse
  • Kinesis Analytics (hiện tại vẫn chưa release bản chính thức)

Kiến trúc của Amazon Kinesis

Mô hình kiến trúc tổng quát của Amazon Kinesis như sau

ebd616cbcf8d6588839017957db8fc81.png

Producers

Là nơi đưa data hay recored vào trong Kinesis. Ví dụ như là một web server gửi log data vào Kinesis, hoặc cũng có thể là Mobile Client khi người dùng upload dữ liệu...

Consumers

Consumer thì lại lấy data từ Kinesis và xử lý nó. Consumers thường là các ứng dụng được chạy trên EC2. Các ứng dụng này có thể lại put data vào Stream khác tạo nên hệ thống xử lý Stream Data theo yêu cầu, hoặc cũng có thể đơn giản là gửi data đến các service khác của AWS.

Điểm mạnh khi bạn sử dụng Kinesis là có thể có nhiều ứng dụng nhận stream data từ 1 stream, khi đó các ứng dụng này xử lý data một cách độc lập và đồng thời với nhau.

Ngoài ra thì mỗi ứng dụng ở consumer cần phải có một cái tên khác nhau. Tên này sẽ được sử dụng để tạo một bảng trong DynamoDB và sử dụng khi theo dõi stream trên Amazon CloudWatch. Khi bạn bắt đầu chạy Stream thì Kinesis sẽ tạo bảng trong DynamoDB với tên là tên của ứng dụng. Bảng được dùng để lưu trạng thái của stream. Do đó tên của ứng dụng phải là duy nhất.

Shards

Shards là một nhóm data records được xác định và duy nhất trên một Stream. Hiểu đơn giản ở đây thì Stream giống như là dòng nước từ điểm A đến điểm B thì shards giống như là ống nước vậy. Càng nhiều ống nước thì bạn càng chuyển được nhiều nước. Mỗi một ống nước này đầu vào có thể ghi đến 1MB/1s (hay là 1000 data records / 1s), trong khi đó đầu ra có thể đưa ra 2MB/1s. Shards thể hiện lưu lượng dữ liệu của bạn truyền vào stream. Nếu lượng dữ liệu lớn thì bạn cần nhiều shard và ngược lại.

Bạn có thể thay đổi số lương shard trên Stream của bạn tùy thuộc vào lượng dữ liệu của bạn bằng cách sử dụng [AWS Streams API](http://docs.aws.amazon.com/kinesis/latest/APIReference/Weinesisard và thời gian sử dụng càng nhiều thì càng tốn tiền

Data Records

Data Record là một đơn vị data trong Amazon Kinesis Streams. Data Records bao gồm có 3 thành phần là

  • Sequence Number: hiểu đơn giản là số thứ tự hay id của Data Record
  • Partition Key: được sử dụng để biết Data Record thuộc về Shard nào trong Kinesis. Partition Key thường là đọc Unicode string có độ dài max là 256 bytes.
  • Data Blob: đây là dữ liệu của chúng ta. Là một chuỗi bytes với max là 1MB. Data Blob không thể bị thay đổi hay can thiệp trong bất cứ trường hợp nào.

Ngoài ra còn một thông số cần lưu ý trong Kinesis là Thời gian lưu trữ (Retention Period). Đây là thời gian lưu trữ cho dữ liệu trên stream trong trường hợp ứng dụng ở consumer của bạn bị down và dữ liệu không được xử lý. Giá trị default cho Retention Period là 24h và max có thể setting là 168h (7 ngày). Nếu như quá Retention Period thì dữ liệu sẽ bị xóa.

Sử dụng của Amazon Kinesis

Kiến trúc của Amazon Kinesis rất đơn giản. Việc sử dụng cũng như vậy. Bạn chỉ cần sử dụng API, put data vào stream. Ở phía ngược lại thì lấy data ra và xử lí nó. Phần này chắc mình không cần phải nói nhiều. API thì các bạn tham khảo ở đây:

http://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html

Điểm mạnh và yếu của Amazon Kinesis

Thông qua phần đầu giới thiệu thì các bạn cũng đã hiểu được phần nào khả năng của Kinesis. Tuy nhiên khả năng mà mình muốn nhấn mạnh ở đây là việc mà nhiều application có thể nhận dữ liệu đồng thời, và các application này xử lý dữ liệu độc lập với nhau.

Đơn giản bạn tưởng tượng ứng dụng của bạn là thống kê log của webserver. Nếu như chỉ có một application thì nó sẽ phải thực hiện đồng thời 2 việc là xử lý đưa ra màn hình + lưu vào database. Với dữ liệu lớn thì chắc chắn việc xử lý đưa ra màn hình bị ảnh hưởng, dễ thấy nhất là chậm đưa kết quả ra màn hình. Bạn cũng muốn tách ra làm 2 process là xử lý data và save data tuy nhiên vấn đề 1 dòng data phải tìm cách gửi đến 2 process có thể sẽ rất lằng nhằng. Nếu như sử dụng Kinesis thì quá đơn giản đúng không nào (hihi)

Nói đến đây để các bạn có thể hiểu được việc nhiều application có thể nhận dữ liệu đồng thời nó quan trọng đến thế nào 😃) Chung quy thì mọi service cũng AWS cũng là để công việc đơn giản hơn mà (tuy nhiên nó làm bạn ngu đi khá nhiều =))

Điểm yếu theo mình ở đây chính là số tiền phải trả dựa trên số shard bạn sử dụng. Dù bạn có thể thay đổi số shard cho phù hợp lưu lượng, nhưng nếu như luồng dữ liệu của bạn không ồn định lúc nhiều lúc ít thì cũng đồng nghĩa với việc bạn luôn phải có 1 process hay 1 cách nào đó kiểm tra luồng dữ liệu và điều chỉnh số shard nếu không muốn quá tốn tiền. Điều này có thể gây không ít phiền toái + lằng nhằng khi code và thiết kế app.

Stream vs Firehorse

Và cuối cùng thì mình giới thiệu phần nhỏ về 2 service của Kinesis là Stream và Firehorse.

Kinesis Stream mang tất cả những đặc điểm, cấu trúc, khả năng của Kinesis. Việc thay đổi số lượng shard đối với Kinesis stream được thực hiện thủ công bằng những dòng code thông qua API. Tất nhiên là vì mang tất cả đặc điểm của Kinesis nên có cả Retention Period như mình giới thiệu bên trên.

Firehorse thì là service thuộc Kinesis ứng dụng cho việc lưu Data vào S3 và Redshift. Có nghĩa là nếu như stream data chỉ đơn thuần là lưu dữ liệu vào S3 và Redshift thì bạn không cần phải viết hẳn 1 ứng dụng để lấy data và save data, mà chỉ cần chỉ bucket cần lưu trên S3, hay bảng cần lưu ở Redshift là Firehorse sẽ tự động lưu cho bạn. Bạn không cần viết ứng dụng.

Firehorse có khả năng tự động thay đổi số lượng shard theo lưu lượng dữ liệu của luồng dữ liệu. Không như Kinesis bạn cần phải thực hiện thử công qua API. Ngoài ra Firehorse cũng không cần Retention Period vì đơn giản đích đến của dữ liệu là service của Amazon mà service này thì làm sao mà down được =))))

Kết luận

Trên đây mình đã giới thiệu về một service cũng khá hay của Amazon là Kinesis. Ngoài ra mình có 1 số link cho các bạn tham khảo:

Rất mong comment từ các bạn và hẹn gặp lại ở các bài tiếp theo (chao)