我该如何编写Cloud Function来接收,解析和发布PubSub消息?

时间:2019-01-04 07:19:45

标签: google-cloud-platform google-cloud-storage google-cloud-functions google-cloud-pubsub google-cloud-python

这可以视为对this thread的后续行动,但是我需要更多帮助。希望有人可以在下面查看我的尝试并提供进一步的指导。

总而言之,我需要一个

  1. 由发布在主题 A 中的PubSub消息触发(可以在用户界面中完成)。
  2. 在“推送” PubSub主题 A 中读取混乱的对象更改通知消息。
  3. “解析”它
  4. 在PubSub主题 B 中发布一条消息,以原始消息ID作为数据,并以其他元数据(例如文件名,大小,时间)作为属性。

。 1:

杂乱的对象更改通知示例:

  

\ n“种类”:“ storage#object”,\ n“ id”:“ bucketcfpubsub / test.txt / 1544681756538155”,\ n“ selfLink”:“ https://www.googleapis.com/storage/v1/b/bucketcfpubsub/o/test.txt”,\ n“名称” :“ test.txt”,\ n“ bucket”:“ bucketcfpubsub”,\ n“ generation”:“ 1544681756538155”,\ n“ metageneration”:“ 1”,\ n“ contentType”:“ text / plain”,\ n“ timeCreated”:“ 2018-12-13T06:15:56.537Z”,\ n“ updated”:“ 2018-12-13T06:15:56.537Z”,\ n“ storageClass”:“ STANDARD”,\ n“ timeStorageClassUpdated“:” 2018-12-13T06:15:56.537Z“,\ n” size“:” 1938“,\ n” md5Hash“:” sDSXIvkR / PBg4mHyIUIvww ==“,\ n” mediaLink“:” {{3 }}“,\ n” crc32c“:” UDhyzw ==“,\ n” etag“:” CKvqjvuTnN8CEAE =“ \ n} \ n

为澄清起见,这是一条带有空白“数据”字段的消息,并且以上所有信息都位于属性对中(例如“属性名称”:“属性数据”)吗?还是只是一个长字符串填充到“数据”字段中,而没有“属性”?

。 2:

在以上线程中,使用了“拉”订阅。它比使用“推送”订阅更好吗?将样本推送到下面:

def create_push_subscription(project_id,
                             topic_name,
                             subscription_name,
                             endpoint):
    """Create a new push subscription on the given topic."""
    # [START pubsub_create_push_subscription]
    from google.cloud import pubsub_v1

    # TODO project_id = "Your Google Cloud Project ID"
    # TODO topic_name = "Your Pub/Sub topic name"
    # TODO subscription_name = "Your Pub/Sub subscription name"
    # TODO endpoint = "https://my-test-project.appspot.com/push"

    subscriber = pubsub_v1.SubscriberClient()
    topic_path = subscriber.topic_path(project_id, topic_name)
    subscription_path = subscriber.subscription_path(
        project_id, subscription_name)

    push_config = pubsub_v1.types.PushConfig(
        push_endpoint=endpoint)

    subscription = subscriber.create_subscription(
        subscription_path, topic_path, push_config)

    print('Push subscription created: {}'.format(subscription))
    print('Endpoint for subscription is: {}'.format(endpoint))
    # [END pubsub_create_push_subscription]

还是在此之后我需要其他代码来接收消息?

此外,难道不是每次发布的发布订阅消息触发云功能时都会创建一个新的订户吗?我应该在CF的末尾添加订阅删除代码,还是有更有效的方法?

。 3:

接下来,为了分析代码,此示例代码具有以下一些属性:

def summarize(message):
    # [START parse_message]
    data = message.data
    attributes = message.attributes

    event_type = attributes['eventType']
    bucket_id = attributes['bucketId']
    object_id = attributes['objectId']

我上面的通知会以1:的形式使用吗?

。 4:

如何分隔topic_name?步骤1和2使用主题 A ,而此步骤是发布到主题 B 。就像在下面的代码示例中重写topic_name一样简单吗?

# TODO topic_name = "Your Pub/Sub topic name"

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_name)

for n in range(1, 10):
    data = u'Message number {}'.format(n)
    # Data must be a bytestring
    data = data.encode('utf-8')
    # Add two attributes, origin and username, to the message
    publisher.publish(
        topic_path, data, origin='python-sample', username='gcp')

print('Published messages with custom attributes.')

我从中获得了大部分示例代码的来源(上述线程之外):https://www.googleapis.com/download/storage/v1/b/bucketcfpubsub/o/test.txt?generation=1544681756538155&alt=media。将上面的代码样本改编并串起来会产生有用的代码吗?还是我仍然会缺少“ import ****”之类的东西?

1 个答案:

答案 0 :(得分:2)

您不应尝试手动创建在Cloud Functions中运行的订阅服务器。相反,请遵循文档here来设置Cloud Function,该函数将通过传递--trigger-topic命令行参数来与发送到给定主题的所有消息一起调用。

要解决您的其他一些顾虑:

“我应该在CF的末尾添加订阅删除代码”-订阅是与特定积压消息相对应的长期资源。如果在云功能结束时创建并删除了订阅,则不接收订阅不存在时发送的消息。

“如何分隔topic_name”-本示例中的“ topic_name”指的是格式为projects/project_id/topics/topic_name的字符串的最后一部分,该字符串的最后一部分将显示在云控制台的this page中,主题创建后。