全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
消息服务

主题+HttpEndpoint使用手册

更新时间:2017-06-07 13:26:11

本文档介绍如何使用python sdk中的sample代码,完成创建主题、创建订阅、启动 HttpEndpoint、发布消息、查看HttpEndpoint接收消息和删除主题操作。

1. 准备

  • 下载最新版python sdk,解压后进入mns_python_sdk子目录;
  • 打开sample.cfg文件,配置AccessKeyID、AccessKeySecret和Endpoint;
    • AccessKeyId、AccessKeySecret
    • Endpoint
      • 访问MNS的接入地址,登陆MNS控制台 单击右上角 获取Endpoint 查看;
      • 不同地域的接入地址不同;
    • SecurityToken
      • 阿里云访问控制服务提供的短期访问权限凭证,直接使用阿里云账号或者子账号访问不需要配置该项,了解详情;
  • 进入sample目录,后续使用的脚本都在这里;

2. 创建主题

运行 createtopic.py 创建主题;
默认创建的主题名称是 MySampleTopic,也可以通过参数指定主题名称;
主题详细信息请参考详情;

  • 运行
  1. $python createtopic.py MyTopic1
  2. Create Topic Succeed! TopicName:MyTopic1
  • 核心代码

endpoint,accid,acckey和token从第1步的配置文件中读取;

  1. #init my_account, my_topic
  2. my_account = Account(endpoint, accid, acckey, token)
  3. topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
  4. my_topic = my_account.get_topic(topic_name)
  5. #you can get more information of TopicMeta from mns/topic.py
  6. topic_meta = TopicMeta()
  7. try:
  8. topic_url = my_topic.create(topic_meta)
  9. print "Create Topic Succeed! TopicName:%s\n" % topic_name
  10. except MNSExceptionBase, e:
  11. if e.type == "TopicAlreadyExist":
  12. print "Topic already exist, please delete it before creating or use it directly."
  13. sys.exit(0)
  14. print "Create Topic Fail! Exception:%s\n" % e

3. 启动 HttpEndpoint

运行 simple_http_notify_endpoint.py 启动 HttpEndpoint;
脚本启动后,输出该脚本的监听地址,这个地址后续作为创建订阅的Endpoint参数,用于接收 MNS 推送消息的请求;

  • 服务器功能

    • 对 MNS 推送消息请求做签名验证,如果错误,返回MNS 403;
    • 解析推送请求的 body,打印到日志中,如果解析错误,返回MNS 400;
    • 如果验权和解析 body 均正常,返回 MNS 201;
  • 运行

  1. $python simple_http_notify_endpoint.py
  2. Start Endpoint! Address: http://10.101.161.37:8080

由于 simple_http_notify_endpoint.py 的代码较多,请直接查看sdk 中的源码。

4. 创建订阅

运行 subscribe.py 创建订阅;
第一个参数指定接收消息的 HttpEndpoint,使用第3步中脚本输出的Address;
第二个参数指定订阅的主题名称,如果第2步中指定了主题名称,这里同样指定主题名称;
第三个参数指定订阅的名称,默认是 MySampleTopic-Sub;
订阅详细信息请参考详情;

  • 运行
  1. $python subscribe.py http://10.101.161.37:8080 MyTopic1 MyTopic1-Sub1
  2. Create Subscription Succeed! TopicName:MyTopic1 SubName:MyTopic1-Sub1 Endpoint:http://10.101.161.37:8080
  • 核心代码

endpoint,accid,acckey和token从第1步的配置文件中读取;

  1. sub_endpoint = sys.argv[1]
  2. #init my_account, my_topic, my_sub
  3. my_account = Account(endpoint, accid, acckey, token)
  4. topic_name = sys.argv[2] if len(sys.argv) > 2 else "MySampleTopic"
  5. my_topic = my_account.get_topic(topic_name)
  6. sub_name = sys.argv[3] if len(sys.argv) > 3 else "MySampleTopic-Sub"
  7. my_sub = my_topic.get_subscription(sub_name)
  8. #you can get more information of SubscriptionMeta from mns/subscription.py
  9. sub_meta = SubscriptionMeta(sub_endpoint)
  10. try:
  11. topic_url = my_sub.subscribe(sub_meta)
  12. print "Create Subscription Succeed! TopicName:%s SubName:%s Endpoint:%s\n" % (topic_name, sub_name, sub_endpoint)
  13. except MNSExceptionBase, e:
  14. if e.type == "TopicNotExist":
  15. print "Topic not exist, please create topic."
  16. sys.exit(0)
  17. elif e.type == "SubscriptionAlreadyExist":
  18. print "Subscription already exist, please unsubscribe or use it directly."
  19. sys.exit(0)
  20. print "Create Subscription Fail! Exception:%s\n" % e

5. 发布消息

运行publishmessage.py 发布多条消息到主题中;
如果第2步中指定了主题名称,这里同样通过第一个参数指定主题名称;
消息详细信息请参考详情;

  • 运行
  1. $python publishmessage.py MyTopic1
  2. ==========Publish Message To Topic==========
  3. TopicName:MyTopic1
  4. MessageCount:3
  5. Publish Message Succeed. MessageBody:I am test message 0. MessageID:F6EA56633844DBFC-1-154BDFB8059-200000004
  6. Publish Message Succeed. MessageBody:I am test message 1. MessageID:F6EA56633844DBFC-1-154BDFB805F-200000005
  7. Publish Message Succeed. MessageBody:I am test message 2. MessageID:F6EA56633844DBFC-1-154BDFB8062-200000006
  • 核心代码

endpoint,accid,acckey和token从第1步的配置文件中读取;

  1. #init my_account, my_topic
  2. my_account = Account(endpoint, accid, acckey, token)
  3. topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
  4. my_topic = my_account.get_topic(topic_name)
  5. #publish some messages
  6. msg_count = 3
  7. print "%sPublish Message To Topic%s\nTopicName:%s\nMessageCount:%s\n" % (10*"=", 10*"=", topic_name, msg_count)
  8. for i in range(msg_count):
  9. try:
  10. msg_body = "I am test message %s." % i
  11. msg = TopicMessage(msg_body)
  12. re_msg = my_topic.publish_message(msg)
  13. print "Publish Message Succeed. MessageBody:%s MessageID:%s" % (msg_body, re_msg.message_id)
  14. except MNSExceptionBase,e:
  15. if e.type == "TopicNotExist":
  16. print "Topic not exist, please create it."
  17. sys.exit(1)
  18. print "Publish Message Fail. Exception:%s" % e

6. 查看 HttpEndpoint 接收消息

第5步发布了多条消息到主题中,MNS 会将发布的消息推送给第3步启动的 HttpEndpoint;
HttpEndpoint 在接收到消息推送请求后,会记录两种日志:access_log 和 endpoint_log;

  • access log
    • 启动 HttpEndpoint 的地方会打印access log,显示推送消息请求的基本信息,从左往右依次是:
      RequestTime RequestVersion ReturnCode URI HTTPVersion RequestLength Host Agent MNSRequestID MNSVersion
    • 除打印到屏幕上,access log会写到日志文件中,文件名格式是access_log.$port,本文档对应的日志文件是access_log.8080;
    • 第5步发布消息对应的推送请求access log如下:
  1. $python simple_http_notify_endpoint.py
  2. Start Endpoint! Address: http://10.101.161.37:8080
  3. [17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A6EF" "2015-06-06"
  4. [17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A712" "2015-06-06"
  5. [17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A704" "2015-06-06"
  • endpoint log
    • 记录每个请求的详细信息,包含完整的header、body以及解析后消息各属性的信息;
    • 日志的文件名格式是 endpoint_log.$port,本文档对应的日志文件是endpoint_log.8080
    • 第5步发布消息对应的推送请求的endpoint log如下:
  1. $cat endpoint_log.8080
  2. ...
  3. [2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1096657216] Notify Message Succeed!
  4. MessageMD5 : 075C3D4AEB2D2F2D6A4C17C9D6DBBEBB
  5. TopicOwner : 1269128356620446
  6. PublishTime : 1463476256857
  7. Subscriber : 1269128356620446
  8. MessageTag :
  9. SubscriptionName : MyTopic1-Sub1
  10. MessageId : F6EA56633844DBFC-1-154BDFB8059-200000004
  11. Message : I am test message 0.
  12. TopicName : MyTopic1
  13. [2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1123260736] Notify Message Succeed!
  14. MessageMD5 : 3BCFB142A3CC597F5D409BFE9DB1B885
  15. TopicOwner : 1269128356620446
  16. PublishTime : 1463476256866
  17. Subscriber : 1269128356620446
  18. MessageTag :
  19. SubscriptionName : MyTopic1-Sub1
  20. MessageId : F6EA56633844DBFC-1-154BDFB8062-200000006
  21. Message : I am test message 2.
  22. TopicName : MyTopic1
  23. [2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1112770880] Notify Message Succeed!
  24. MessageMD5 : 8356BC7FFBD22CC971BE7FF7427202B6
  25. TopicOwner : 1269128356620446
  26. PublishTime : 1463476256863
  27. Subscriber : 1269128356620446
  28. MessageTag :
  29. SubscriptionName : MyTopic1-Sub1
  30. MessageId : F6EA56633844DBFC-1-154BDFB805F-200000005
  31. Message : I am test message 1.
  32. TopicName : MyTopic1

7. 删除主题

运行deletetopic.py 删除主题;
如果第2步中指定了主题名称,这里同样通过第一个参数指定主题名称;

  • 运行
  1. $python deletetopic.py MyTopic1
  2. Delete Topic Succeed! TopicName:MyTopic1
  • 核心代码
  1. #init my_account, my_topic
  2. my_account = Account(endpoint, accid, acckey, token)
  3. topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
  4. my_topic = my_account.get_topic(topic_name)
  5. try:
  6. my_topic.delete()
  7. print "Delete Topic Succeed! TopicName:%s\n" % topic_name
  8. except MNSExceptionBase, e:
  9. print "Delete Topic Fail! Exception:%s\n" % e
本文导读目录