gotiredofcoding
gotiredofcoding

Reputation: 127

Pubsub from a Function published in the background?

The whole reason I use PubSub is in order to not make my Cloud Function to wait, so things happens auto. To publish a topic from a Function, the code Google Docs show is :

# Publishes a message to a Cloud Pub/Sub topic.
def publish(topic_name,message):

     # Instantiates a Pub/Sub client
    publisher = pubsub_v1.PublisherClient()
    if not topic_name or not message:
        return ('Missing "topic" and/or "message" parameter.', 400)

    # References an existing topic
    topic_path = publisher.topic_path(PROJECT_ID, topic_name)

    message_json = json.dumps({
        'data': {'message': message},
    })
    message_bytes = message_json.encode('utf-8')

    # Publishes a message
    try:
        publish_future = publisher.publish(topic_path, data=message_bytes)
        publish_future.result()  # Verify the publish succeeded
        return 'Message published.'
    except Exception as e:
        print(e)
        return (e, 500)

Which means Function is waiting for respond, but i want my Function to spend 0 seconds on this. How can I publish and forget ? not wait for respond? (without more dependencies?)

Upvotes: 1

Views: 785

Answers (2)

Yewla
Yewla

Reputation: 324

You can schedule your functions to run at certain times of the day or every 'interval' time. In this example, this would go into your index.js file and deployed to your functions.

The code would run 'every minute' in the background. The error would simply return to your logs in google cloud console.

If you are using firestore and need to manage documents, you can make the function run on specific events like on document create or update etc..

https://firebase.google.com/docs/functions/firestore-events

EDIT: Not exactly sure if this example matches your use case but hope this example helps

exports.scheduledFx = functions.pubsub.schedule('every minute').onRun(async (context) => {

    // Cron time string Description
    // 30 * * * *   Execute a command at 30 minutes past the hour, every hour.
    // 0 13 * * 1   Execute a command at 1:00 p.m. UTC every Monday.
    // */5 * * * *  Execute a command every five minutes.
    // 0 */2 * * *  Execute a command every second hour, on the hour.
 
    
    try {
      //your code here
    
  
    } catch (error) {

      return error

    }
    
})

Upvotes: 1

Doug Stevenson
Doug Stevenson

Reputation: 317322

As you can see from the comments in the code, it is waiting to make sure that the publish succeeded. It's not waiting for any sort of response from any of the subscribers on that topic. It's extremely important the code wait until the publish succeeds, otherwise the message might not actually be sent at all, and you risk losing that data entirely. This is because Cloud Functions terminates the code and locks down CPU and I/O after the function returns.

If you really want to risk it, you could try removing the call to result(), but I don't think it's a good idea if you want a reliable system.

Upvotes: 3

Related Questions