Tìm hiểu về dịch vụ AWS Kinesis. So sánh AWS Data Stream và AWS Kinesis Firehose

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…

Các thành phần AWS Kinesis

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.

Shards

Shards là đơn vị tính trong Kinesis Data Stream, 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.

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

  • Điểm mạnh: Sự đơn giản cho phép bạn dễ dàng thiết lập dịch vụ Streaming dữ liệ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.

So sánh Data Stream vs Data Firehose

  • AWS Kinesis Data Streams: là dịch vụ AWS có khả năng tùy biến cao phù hợp cho developer xây dựng các ứng dụng riêng hoặc streaming dữ liệu cho nhu cầu đặc biệt. Tuy vậy giải pháp này đòi hỏi phải thực hiện mở rộng và cấp phát thủ công. Dữ liệu thông thường tồn tại trong stream trong 24 giờ, và lên đến 7 ngày trong trường hợp người dùng sẵn sàng trả thêm chi phí.
  • AWS Kinesis Firehose: điều khiển quá trình tải dữ liệu sang các dịch vụ AWS khác nhằm mục đích xử lý. Việc mở rộng được thực hiện hoàn toàn tự động với tốc độ lên đến GB/s và cho phép thực hiện tác vụ xử lý hàng loạt (batching), nén và giải nén. Giải pháp này được sử dụng để streaming dữ liệu sang S3, Elastic Search và Redshift, ở đó dữ liệu sẽ được sao chép để chuyển sang xử lý cho 1 dịch vụ nào đó khác.

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.

 Đặc tínhKinesis Data StreamKinesis Firehose
Mục đíchDịch vụ streaming độ trễ thấp với đầu vào có khả năng mở rộngDịch vụ tải dữ liệu vào Amazon S3, RedShift, Elastic Search và Splunk
Khả năng cấp phátDịch vụ Managed service nhưng vẫn cần cấu hình shardDịch vụ managed service hoàn toàn, không cần quản trị
Khả năng xử lýRealtime với độ trễ 200ms thông thường, và khi tối ưu 70msNear realtime, phụ thuộc vào buffer size hoặc buffer time (min 60s)
Khả năng mở rộngPhải quản lý việc mở rộng bằng cách cấu hình shardTự động scaling theo nhu cầu
Lưu trữ dữ liệuCó khả năng cấu hình từ 1-7 ngàyKhông lưu trữ
Producer Cần phải viết code cho producer. Hỗ trợ SDK, Kinesis Agent, KPL, Cloud Watch, IoTCần phải viết code cho producer. Hỗ trợ Data Stream, Kinesis Agent, KPL, Cloud Watch, IoT
ConsumerĐặc tính mở. Hỗ trợ nhiều consumer và đích. Hỗ trợ Consumer và Spark. Đặc tính đóng. Không hỗ trợ KCL hoặc Spark

Chi phí AWS Kinesis

Kinesis Data Stream tính phí theo 02 tham số chính:

  • Số giờ shard, trong đó một shard có thể xử lý được 1 MB/s và 1000 record/s
  • Số lượng PUT load, thường chia thành các chunk 25KB

Ngoài ra trong trường hợp sử dụng các tính năng nâng cao hiệu suất như fan-out hay kéo dài thời gian lưu trữ thì sẽ tính thêm phí.

Kinesis Firehose tính phí theo dung lượng dữ liệu xử lý đầu vào theo từng gói dung lượng.

Data Ingested, per GB
First 500 TB / month$0.029
Next 1.5 PB / month$0.025
Next 3 PB / month$0.02

Tham khảo

https://docs.aws.amazon.com/firehose/latest/dev/log-data-from-vpc-to-cw.html

https://techblog.vn/aws-kinesis

Leave a Reply

Your email address will not be published. Required fields are marked *