2017-04-01 64 views
1

我目前正在将我的firebase-queue工作人员移至Firebase的Cloud Functions。我通过APNS和GCM发送推送通知给设备的其中一名工作人员。对于通过APNS发送推送通知,我使用的库node-apn中,我创建使用在Cloud Function的多个调用之间维护持续连接

const apnConnection = new apn.Connection(connectionOptions);

然后,我可以使用apnConnection推送通知发送到设备,每当我收到一个只保留到APNS的持久连接任务发送一个,而不需要每次重新创建它。

apnConnection.pushNotification(pushNotification, device);

我想问问如果这样的持久连接将一个火力地堡功能的调用多个之间也保持或我需要创建这个连接,并关闭它的火力地堡函数的每次调用。我的火力地堡功能看起来像

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 

admin.initializeApp(firebaseConfig); 

const apnConnection = new apn.Connection(connectionOptions); 

exports.verifyCode = functions.database.ref('/tasks/sendPushNotification/{taskId}') 
    .onWrite(event => { 
    const taskSnapshot = event.data 
    if(!taskSnapshot.exists()) { 
     return 
    } 
    const task = taskSnapshot.val() 

    // Create pushNotification and device from the task 

    return apnConnection.pushNotification(pushNotification, device); 
    }) 

我认为它归结到功能是否能保持调用之间的一些状态或者是他们更喜欢AWS lambda函数,这是完全无状态的,因为我们只初始化管理SDK一次,我认为它在调用之间保持着某种状态,但在移动代码之前我想检查一下。

回答

1

虽然大多数情况下你的函数将在同一个容器中调用,但你不能依赖这个。容器可能会被回收或GCF可能旋转额外的容器,以防您的函数被调用的时间超过单个容器可以处理的时间

+0

当添加新容器来处理额外负载时,该容器是否不执行通用代码'admin.initializeApp(firebaseConfig); const apnConnection = new apn.Connection(connectionOptions);'在我的情况下并维护自己的'apnConnection'? –

+0

是的,它这样做。如果你分享你遇到的问题,也许会更容易帮助你。 –

+0

我有问题中的代码。我的问题是,可以在'verifyCode'云端函数之外使用'const apnConnection = new apn.Connection(connectionOptions);''verifyCode'函数中使用'apnConnection'或者是否需要将它移动到函数并为每个云功能调用创建一个新连接。从我的回答和评论中了解到的情况来看,我认为将它放在云端功能之外是可以的,因为这些功能在保持运行的容器内运行,并且可以根据负载添加或移除更多容器。 –