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 ...
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
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
- Tối đa số lượng shard default là khác nhau. Tham khảo thêm tại: http://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html Tuy nhiên nếu bạn cần nhiều shard hơn tối đa ban có thể request với form trong link trê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