AWS SNS - Mobile Push Notification Service for Ruby on Rails

Tại sao chúng ta cần sử dụng notification service cho Ruby on Rails

Ruby on Rails sử dụng phương thức HTTP - giao thức không trạng thái dựa trên yêu cầu đáp ứng để giao tiếp với người dùng cuối. Người dùng sẽ gửi yêu cầu tới server và nhận lại dữ liệu cần thiêt. Phương thức này đơn giản và cực kỳ mạnh mẽ. Từ phiên bản V5 sockets đã được tích hợp sẵn trong framework như một thành phần cơ bản.

Tuy vậy, với mô hình client - server hiện nay thì cách thức trên là không đủ sử dụng khi phía mobile muốn nhận không báo từ phía server. Để giải quyết vấn đề này những dịch vụ máy chủ chuyên sử dụng để push notification ra đời. Trong bài viết này mình xin giới thiệu dịch vụ "Simple Notification Service" của Amazone.

Giải pháp

Một cách mà nhiều người thường dùng nhất đó là sử dụng trực tiếp server chạy Rails để push notification. Tuy nhiên cách này lại có một số bất lợi sau:

  • Server nặng vì phải sử dụng một phần tài nguyên riêng biệt để push notification.
  • Thời gian cấu hình lâu và phức tạp.

Vì những lý do trên một lựa chọn đơn giản và tiện dụng hơn là sử dụng dịch vụ push notification của Amazone. Dịch vụ sử dụng mô hình sender-topic-subscriber pattern để gửi và nhận thông báo. Dịch vụ này có những điểm lợi sau:

  • Không chỉ gửi notification cho di động mà còn có thể gửi cho Amazon SQS, email, SMS or HTTP/S
  • Chi phí khá rẻ, 1$ cho 1 triệu lượt push notification cho di động.

Config AWS SNS trên console của AWS

Trước khi thực hiện chức năng đẩy SNS trong ứng dụng Rails, chúng ta phải giải quyết một số cấu hình đơn giản trong AWS Management Console - Amazon Web Services.

Trên bảng điều khiển AWS, chúng ta chọn phần Servics => Simple Notification Service trang chủ của AWS SNS hiện ra:

Click button "Get started" để vào giao diện chính để cài đặt.

Chọn "Create platform application" để tạo một ứng dụng trên nền tảng phù hợp.

Để kết nối tới Google hoặc Apple chúng ta cần lưu ý một số vấn đề:

  • Với IOS device sẽ cung cấp hai môi trường phát triển là develop và production tùy cho mục đích sử dụng. Sử dụng file P12 để cung cấp Chứng chỉ và khoá cá nhân , file P12 có thể có hoặc không có password.
  • Với Google chỉ cần khóa API GCM từ Google Developer và dịch vụ GCM phải được bật.

Sau khị tạo xong ứng dụng trên nền tảng phù hợp sẽ xuất hiện trên danh sách ứng dụng của bạn với chuối ARN được gán cho mỗi ứng dụng.

Push notification trong Rails

Để hoàn thành việc push notification trong ứng dụng Rails chúng ta cần cài đặt Gem AWS-SDK sẽ hỗ trợ chúng ta thao tác với service được tiện lợi hơn.

Tạo file config như sau trong ứng dụng config/initializers/aws.rb

Aws.config[:credentials] = Aws::Credentials.new(ENV['AURA_AWS_ACCESS_KEY_ID'], 

                                                ENV['AURS_AWS_SECRET_ACCESS_KEY'])

Aws.config[:region] = 'us-west-2'  

Các thông tin biến môi trường sẽ được lấy từ tài khoản AWS tạo ứng dụng push notification với nền tảng phù hợp.

Để push notification chúng ta sử dụng method đơn giản sau:

  def self.push(platform_application_arn, token, text, push_content,  stub_responses = false)
    sns = Aws::SNS::Client.new(stub_responses: stub_responses) \

    # Determine device -> message recipient
    jasons_endpoint = sns.create_platform_endpoint(
      platform_application_arn: platform_application_arn,
      token: token
    ).endpoint_arn

    # Define a push notification message with metadata
    payload = {
      notification_id: "15",
      aps: { 
        alert: text,
        badge: 1,
        sound: "default"
      }, 

      push_content: push_content
    }

    # The same message will be sent to production and sandbox    
    message = { 
      APNS: payload.to_json,
      APNS_SANDBOX: payload.to_json
    }.to_json

    # Pushing message to device through endpoint 
    resp = sns.publish(
      target_arn: jasons_endpoint,
      message: message,
      message_structure: "json",
    )

  # Some error handling need to be made
  rescue => e
    false
  end    

Trong đó:

  • platformapplicationarn: Chuỗi ARN để xác định ứng dụng trong danh sách rất nhiều ứng dụng trên AWS
  • token: Chuỗi token để xác định thiết bị nào sẽ được nhận thông báo.
  • text: Chuỗi văn bản sẽ được gửi tới thiết bị nhận.
  • stub_responses: Tham số để phân biệt các request push notification là giả mạo. Mặc định giá trị là false

Kết luận

Thật đơn giản và tiện lợi phải không các bạn? Các bạn có thể tham khảo thêm một số dịch vụ khác được AWS cung cấp tại AWS Management Console - Amazon Web Services

Thanks you for reading.