0

我在 AWS Lambda 中开发了一个推送通知引擎,使用 One Signal over https,它工作得很好。我可以根据传入的 IoT 规则触发通知,并将它们近乎实时地发送出去。

async function sendNotification(data, api_key) {
    
    console.log("Data to POST : " , data);
    const response = await new Promise((resolve, reject) => {
        
        var headers = {
            "Content-Type": "application/json; charset=utf-8",
            "Authorization": api_key
        };

        var options = {
            host: "onesignal.com",
            port: 443,
            path: "/api/v1/notifications",
            method: "POST",
            headers: headers
        };
    
        const req = https.request(options, function(res){
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
            res.on('data', (data) => {
                var buff = Buffer.from(data, 'utf8');
                console.log('data received: ',  buff.toString());
            });
        });
        
        req.on('error', (e) => {
            console.error(e);
        });
        req.write(JSON.stringify(data));
        req.end();
        return;
    });
    return response;
}

导致此代码运行的条件每天可以触发多次。问题是,在某些情况下,我每天最多只需要发送一次通知,有时只有在之前的通知已发送给该用户的情况下。我想我的问题是存储状态的最佳位置在哪里?

  1. 有没有一种方法可以以幂等的方式安排通知,以便后续调用不会发送多个,而是会相互覆盖,并只导致一个调用?可以以某种方式使用 SNS 吗?

  2. 另一个想法是使用设备阴影。这是一种可能的解决方案,其中状态可以存储在那里并用于确保在需要时一次且仅一次发送第一个通知,并在需要时升级以发送更严重的通知?

4

1 回答 1

0

您可以在 EventBridge 中创建一个每天运行一次的计划。每当这个时间表变成一个向下游发送的事件时;它将有一个唯一的事件 ID。您可以使用此事件 ID(可能保存在数据库或临时缓存中)以确保您只触发一次。

或者,您可以记录任何客户的最后一次调用,然后在每次调用之前检查它。

于 2021-01-01T02:10:38.697 回答