Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查看google发布/订阅何时完成_Python_Google Cloud Platform_Google Cloud Pubsub - Fatal编程技术网

Python 如何查看google发布/订阅何时完成

Python 如何查看google发布/订阅何时完成,python,google-cloud-platform,google-cloud-pubsub,Python,Google Cloud Platform,Google Cloud Pubsub,从客户端,我有以下代码: publisher = pubsub_v1.PublisherClient() topic_path = publisher.topic_path(project_id, topic_name) future = publisher.publish(topic_path, data=json.dumps(dict(op='create_master', review_id=1273612))) 是否有办法检查项目何时完成处理?如果是这样,将如何做到?现在,我无法知道某

从客户端,我有以下代码:

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_name)
future = publisher.publish(topic_path, data=json.dumps(dict(op='create_master', review_id=1273612)))

是否有办法检查项目何时完成处理?如果是这样,将如何做到?现在,我无法知道某人是否“工作”。

要知道该消息已成功发布,您需要查看未来的结果。首选方法是异步执行此操作:

def callback(future):
  try:
    print(future.result()) # future.result() is the message ID for the published message.
  except Exception as e:
    print("Error publishing: " + str(e))

future = publisher.publish(topic_path, data=json.dumps(dict(op='create_master', review_id=1273612)))
future.add_done_callback(callback)
如果需要,也可以同步执行此操作。在将来调用
result()
将被阻止,直到发布结果可用:

future = publisher.publish(topic_path, data=json.dumps(dict(op='create_master', review_id=1273612)))
try:
  print(future.result()) # future.result() is the message ID for the published message.
except Exception as e:
  print("Error publishing: " + str(e))

没有内置的方法可以知道订阅者何时完成了对消息的处理。要求发布者知道订阅者何时处理了消息是一种反模式;发布者和订阅者意味着分离彼此不直接了解的实体。也就是说,如果你需要这种信息,最好的方法是设置第二个主题,让原始订阅者在完成处理后发布消息,原始订阅者可以订阅该主题,以便知道处理何时完成。

设置此主题的一种方法是基于
消息id
将其存储到数据库中。例如,以下是一些示例服务器代码:

def callback(message):

    # Message has been received by the Server/Subscriber
    cursor.execute('INSERT IGNORE INTO pubsub (id, message, received) VALUES (%s, %s, NOW())', (message.message_id, message.data))
    connection.commit()

    # Message is processed by the Server/Subscriber
    data_obj = loads(message.data)
    _process(data_obj)

    # Message has finished being processed by the Server/Subscriber
    cursor.execute('UPDATE pubsub SET completed=NOW() WHERE id=%s', (message.message_id,))
    connection.commit()
    message.ack()

客户机可以通过
future.result()
访问
id
,因此可以轻松查询该id以查看状态。如果在单独的进程中查看状态(例如,如果100个长期运行的进程正在运行,并且我们希望跟踪哪些进程已经完成),这将特别有用.

你是说你想知道发布已经完成,发布/订阅已经收到消息,还是说你想知道订阅者已经收到消息并完成了处理?@KamalAboul Hosn——事实上。但最重要的是,服务器已经完成了对项目的处理。感谢您的回答,这真的很有帮助。我使用了一种非常简单的数据库方法来存储
messageID
,以跟踪消息的接收和处理时间。这种方法合理吗?这取决于用例。对acks使用Pub/Sub与使用数据库的主要区别在于查询模型。如果使用数据库,则必须显式查询以确定消息是否已被处理。如果您在发布服务器中使用发布/订阅和订阅服务器,则在处理完成后,您会立即收到ACK。如果您正在执行某种脱机对账过程,那么数据库将运行良好。但在这一点上,您可能根本不需要使用Pub/Sub;只需让您的发布者写入数据库,并让您的订阅者查询数据库以获取要处理的消息。您可能希望在更新数据库后确认消息。否则,如果您的订阅进程在更新发生之前崩溃,您将不会再次收到消息,因此您在数据库中的输入将永远不会被标记为已完成。@KamalAboul Hosn这是有意义的——感谢您的注释(上面编辑)。@KamalAboul Hosn上述方法是常见的(或至少是合理的)跟踪酒吧/酒吧的模式?发布/订阅的大多数用户关心发送/接收项目的时间吗?正如我在回答中提到的,发布者需要知道订阅者何时完成了消息处理,这被认为是一种反模式。它将两者结合在一起,而不是使用发布/订阅的首选方式。该范例的一个要点是发布者和订阅者的分离。因此,它是否合理,实际上取决于出版商(或其他服务机构)如何处理这些信息。