asp.net-mvc - 使用 aws pinpoint 获取已发送消息的传递状态的最佳方法是什么?
问题描述
我浏览了 AWS pinpoint 文档以检查已发送 SMS 消息的传递状态。但是,除了将 SMS 事件流式传输到 Amazon Kinesis Data Streams 或 Amazon Kinesis Data Firehose,然后将数据发送到 Amazon S3 存储桶或 Amazon Redshift 数据库,然后再发送到应用程序之外,我找不到任何更好的方法。
在这里,我的要求是只发送验证码并获取短信的发送状态。有没有更好的方法来实现这一点?因为我上面提到的方式太冗长,成本太高。任何帮助将不胜感激。
解决方案
sendMessages() API 返回 SMS 的状态。假设此 API 可能不会立即返回发送状态,因为 SMS 可能不会立即发送。
但是由于“回调”,返回需要时间,异步工作。
它返回的状态是什么? 参考: https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Pinpoint.html#sendMessages-property
在回调中,返回的 json“数据”具有“ MessageResponse ”字段“ Result ”具有字段“ DeliveryStatus ”,其可能值如下:
- “成功的”
- “节流”
- “TEMPORARY_FAILURE”
- “PERMANENT_FAILURE”
- “UNKNOWN_FAILURE”
- “选择退出”
- “复制”
为什么需要通过 Kinesis、S3 存储桶和 Analytics 进行状态更新?其实不需要。使用 Kinesis,您可以获得更详细的信息。
在更简单的方法上,AWS专家提到使用Lamda服务直接发送到一些“队列”(可能是另一个AMZ产品)或通过Lamda服务调用HTTP端点。所有这些服务都是昂贵的,并且还花费了其他资源。“总拥有成本”只会增加,或者这些人正在“向上销售”更多产品。
我想发送交易短信。而已。我需要知道是否发送了短信。而已。但是您最终会为 Kinesis(无论成本多少)、S3、分析服务、相关的 EC2、EBS 一切支出。
我与 AMZ Architect 进行了艰苦的讨论,他们决定使用 Kinesis,如果您使用 Kinesis 配置 Pinpoint,您可以直接轮询并获取状态。因此,我也通过Kinesis获得 SMS 事件更新,这与您通过调用 getMessages() API 获得的“相似”。
在直接通过 Kinesis 的 SMS 事件流中,您将“event_type”值作为
- “_SMS.BUFFERED”
- “_SMS.SUCCESS”
- “_SMS.FAILURE”
- “_SMS.OPTOUT”
参考: https ://docs.aws.amazon.com/pinpoint/latest/developerguide/event-streams-data-sms.html
以及你得到的“record_status”字段的值
- “成功的”
- “发表”
- “待办的”
- “无效的”
- “遥不可及”
- “未知”
- “封锁”
- “CARRIER_UNREACHABLE”
- “垃圾邮件”
- “INVALID_MESSAGE”
- “CARRIER_BLOCKED”
- “TTL_EXPIRED”
- “MAX_PRICE_EXCEEDED”
其中一些状态代码可能与您的情况无关。例如,如果您发送“延迟”短信,则“TTL_EXPIRED”是可能的值。
Kinesis,提供了更详细的信息,但可能没有实际用处。
如果您使用 Kinesis 超过了您的最大 SMS 成本配额,您就会明白原因。使用sendMessages() API,您不会。但您可以通过 API 查看短信配额。
参考: https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ServiceQuotas.html#getServiceQuota-property
我坚信,如果发送本质上优先发送的“事务性”短信,则不需要 Kinesis。
在某些情况下,亚马逊通过将服务融入复合解决方案来实现超卖。无论如何,他们并没有错,Pinpoint 是用于营销活动、用户旅程和转化分析的“营销”产品。对于亚马逊来说,“只发送短信”是更大的商业案例。您可能无法为您的用例获得最佳建议,因此请努力协商以节省您的美元。
推荐阅读
- php - 如何查找外部查询的总记录
- python - IBM cloud/bluemix 上的 Python Flask 应用程序,带有 Textblob 库抛出异常 - textblob.exceptions.MissingCorpusError
- ios - 当根视图设置为不同的视图控制器时,导航控制器将变为视图控制器
- r - 关于 cgdsr R 包
- tensorflow - Tensorflow 中 v.assign(v + 1) 和 v = v + 1 的区别
- node.js - 通过 git bash 指定要使用的节点版本
- java - 如何跟踪对象的前后属性?
- javascript - 函数式编程免点更多参数
- ios - 邮递员给出不同的回应
- c++ - 通过 __VA_OPT__ 递归宏