Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在SQS lambda环境中,建议采用何种扇出方式?_Amazon Web Services_Aws Lambda_Architecture_Amazon Sqs_Serverless Framework - Fatal编程技术网

Amazon web services 在SQS lambda环境中,建议采用何种扇出方式?

Amazon web services 在SQS lambda环境中,建议采用何种扇出方式?,amazon-web-services,aws-lambda,architecture,amazon-sqs,serverless-framework,Amazon Web Services,Aws Lambda,Architecture,Amazon Sqs,Serverless Framework,我希望通过SQS/消息传递队列体系结构向lambda环境中数据库中的用户发送推送通知,以便做到这一点 我首先需要在启用推送通知的情况下查询数据库中的所有用户 把它们都绕过去 为每个用户发送SQS事件/消息 让我的sqs触发lambda处理/发送推送通知 有没有更好的方法来实现这一点,以避免查询大量用户和/或循环所有结果来为每个用户发送SQS消息?我在这里会采取稍微不同的方法,但类似 为用户查询数据库 在用户上循环 向SQS发送一条消息以获取要发送的一批记录,并使用SQS的SendMessageB

我希望通过SQS/消息传递队列体系结构向lambda环境中数据库中的用户发送推送通知,以便做到这一点

  • 我首先需要在启用推送通知的情况下查询数据库中的所有用户
  • 把它们都绕过去
  • 为每个用户发送SQS事件/消息
  • 让我的sqs触发lambda处理/发送推送通知

  • 有没有更好的方法来实现这一点,以避免查询大量用户和/或循环所有结果来为每个用户发送SQS消息?

    我在这里会采取稍微不同的方法,但类似

  • 为用户查询数据库
  • 在用户上循环
  • 向SQS发送一条消息以获取要发送的一批记录,并使用SQS的
    SendMessageBatch
    操作发送这些记录。所以一批批的。每一批消息都有几个“用户”要发送,而不仅仅是一个。这将提高性能,因为批处理需要更少的lambda调用
  • Lambda处理SQS消息(可能不止一条),每个SQS消息都会导致发送许多推送通知。就Firebase而言,我相信有一种方法可以发送批次,这甚至更好。即使没有这一点,您也可以使用
    Promise.all
    类型逻辑一次发送多条消息
  • 使用这种结构,您可以非常快速地发送大量消息,而且可能会便宜得多。假设您需要向100万用户发送邮件。如果您向SQS发送100个批次(25个批次)的消息,那么每次调用SQS都有2500条消息。这意味着400次呼叫SQS,甚至比25次一批发送一条消息所需的40K次数要好得多

    在接收端,即使将SQS集成限制为每次调用1条消息,也会有10000次lambda调用。如果假设每次调用1次,并发调用1000次,则需要10秒(可能更少)。如果您为每个用户发送一条消息,则必须进行1M lambda调用。如果您假设每次调用需要100毫秒,那么您可以每秒发送10次,因此如果执行1000次并发执行,则需要100秒。事实上,这些数字可能比批处理版本的数字还要好,特别是如果您不限制一次只发送一条消息的话

    编辑 根据评论,这个问题似乎更多的是关于过程的第一部分。考虑到这一点,我建议以下选项

  • 如果您发现自己需要重复处理相同的大型组,大多数消息服务(Firebase和SNS)都支持某种主题订阅模式。鉴于这些是推送通知,您可以在代码中将设备订阅到主题。这最终会导致从代码向消息传递服务发送一条消息。服务处理其余的事务。这可能是任何有大量收件人的情况下的首选解决方案,尤其是如果您可以预先了解收件人的话。这甚至适用于动态主题。例如,考虑一个人评论某一职位的情况。对该帖子的任何新评论都应该向所有对该帖子发表评论的人发送一条消息。您可以在创建帖子时动态创建主题,并在收件人发表评论时向主题添加收件人。如果用户希望停止接收消息,可以将该用户从主题中删除
  • 如果您事先不知道收件人,则上述解决方案为固溶体。但是,如果您关心前两个步骤上的Lambda超时,我会稍微修改一下。我将利用AWS Step函数,并在lambda中分页数据。Lambda将通过调用中提供的
    上下文
    对象告诉您还有多少时间。您可以定期检查,以确定是否应该退出lambda并将当前分页信息传递给step函数。step函数可以将分页信息传递回lambda,lambda应该编码为接受分页信息作为请求的一部分,如果提供了,则从该点继续
    
    我建议您在应用程序体系结构中增加一部分,
    我个人倾向于避免使用主数据库进行繁重的查询,
    假设您的用户群很大。

    我建议在搜索引擎(如ElasticSearch或CloudSearch)中维护您的用户列表,或在AWS DynamoDb中仅维护用户列表的简单表格,或创建数据库的读取副本。
    为避免混淆,请使用搜索引擎(首选)或AWS DynamoDb

    这将避免在查询read Speciality数据存储时对数据库造成压力,并且不会影响运行中的其他模块
    用这种方式查询很快

    第二步:将它们全部循环

    步骤3:像Jason建议的那样,使用SendMessageBatch方法向SQS批量发送消息


    步骤4:根据您的SQS设置,您可以在Lambda函数上处理多条消息

    FYI您可以批量发送和接收SQS消息。SQS触发的Lambda是否必须查找有关用户的信息才能知道将通知发送到何处,或者是否在步骤1中收集了所有信息?是否?您是否向所有用户发送完全相同的消息?这是一条短信,还是他们设备上的移动应用推送?您是将此消息发送给所有用户,还是基于某种逻辑仅发送一个子集?该组是否可能被重复使用,或者每个邮件的收件人列表是否不同?(请随意编辑您的问题以添加这些细节,而不是通过评论进行回答。)@JasonWadsworth在步骤1中收集了所有信息,SQS触发的lambda只需使用收到的信息调用PushNotification服务info@JohnRotenstein我没有使用SNS,我使用的是firebase云消息。这是对移动应用程序的推送通知。这是同样的信息是的,还有