2017-04-01 37 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'或者是否需要將它移動到函數併爲每個雲功能調用創建一個新連接。從我的回答和評論中瞭解到的情況來看,我認爲將它放在雲端功能之外是可以的,因爲這些功能在保持運行的容器內運行,並且可以根據負載添加或移除更多容器。 –