Ruby FB Messenger API-接收双重请求

Ruby FB Messenger API-接收双重请求,ruby,facebook,api,httpresponse,facebook-messenger,Ruby,Facebook,Api,Httpresponse,Facebook Messenger,我有一个用Ruby构建的FB机器人,可以让玩家玩清道夫狩猎游戏 不过有时候,当我在一个团队中有多个玩家时,FB会两次向我发送玩家“答案”webhook。我已经研究过了,起初认为这是因为若FB并没有得到200 OK响应,那个么会有20秒的超时()。在检查了日志之后,仅仅14秒之后,我就收到了来自FB的第二个webhook。见下文: # Webhook #1 {"object"=>"page", "entry"=>[{"id"=>"252445748474312", "time"

我有一个用Ruby构建的FB机器人,可以让玩家玩清道夫狩猎游戏

不过有时候,当我在一个团队中有多个玩家时,FB会两次向我发送玩家“答案”webhook。我已经研究过了,起初认为这是因为若FB并没有得到200 OK响应,那个么会有20秒的超时()。在检查了日志之后,仅仅14秒之后,我就收到了来自FB的第二个webhook。见下文:

# Webhook #1 
{"object"=>"page", "entry"=>[{"id"=>"252445748474312", "time"=>1532153642358, "messaging"=>[{"sender"=>{"id"=>"1709242109154907"}, "recipient"=>{"id"=>"252445748474312"}, "timestamp"=>1532153641935, "message"=>{"mid"=>"0FeOChulGjuPgg3YJqEgajNsY8kMfNRt_bpIdeegEeE54h-KB8szcd-EQ-UHUT3850RwHgH4TxVYFkoFwxqhtg", "seq"=>402953, "text"=>"Larrikins"}}]}]}

# Webhook #2 (14 seconds later)
{"object"=>"page", "entry"=>[{"id"=>"252445748474312", "time"=>1532153656901, "messaging"=>[{"sender"=>{"id"=>"1709242109154907"}, "recipient"=>{"id"=>"252445748474312"}, "timestamp"=>1532153641935, "message"=>{"mid"=>"0FeOChulGjuPgg3YJqEgajNsY8kMfNRt_bpIdeegEeE54h-KB8szcd-EQ-UHUT3850RwHgH4TxVYFkoFwxqhtg", "seq"=>402953, "text"=>"Larrikins"}}]}]}
请注意,除了第一个“time”属性(14秒后)之外,这两个属性完全相同

由于我在收到第一个webhook后处理了许多方法和调用,所以只有在我完成发送响应消息后(因此延迟14秒),才会将200 OK响应发送回FB

所以我有两个问题:

  • 14秒延迟是否太长,这就是FB重新发送的原因?如果是这样,我如何能立即发送200OK响应(
    head:ok

  • 这完全是另一个问题吗

  • 您还可以确保“Echo”已禁用

    转到设置>网络挂钩,编辑事件

    建议使用NodeJS之类的异步语言,在我使用AWS SQS的情况下,我的工作人员在不阻塞的情况下处理请求(不要等待),我向FB返回200,“ok”,以避免FB再次向我的webhook发送消息


    另外,apporach可能将mid存储在数据库中,并在每个请求中检查mid是否存在,如果存在,则不处理消息。我使用Dynamo DB(AWS)时启用了TTL,因此使用TTL,我的数据库每小时自动清理一次,删除旧请求。

    我认为这是回复前的15秒等待,当你回复不够快时,Facebook会自动重试。Tee EEe Te的想法是可靠的,编写一些机制来缓存MID,并在处理之前检查它是否是重复的

    如果首先需要14秒来确定响应内容,那么您就不能提前发送“OK”响应;只有当您能够更快地响应用户的消息,但对接收到的数据执行额外的操作需要更长的时间(但可以在后台执行,或在响应并关闭连接后执行)时,这才有意义。@CBroe是的,这就是我的想法。我想我可以做一些背景工作来加速14秒。但不确定这是否会破坏即时“聊天”体验。仍然不相信是14秒导致FB重新发送,尽管超时时间显然是20秒?提到自动机器人必须在30秒内做出响应,但这更多的是关于用户体验的政策,不一定是关于技术限制。也许尝试记录您的响应时间(webhook udpate收到的响应与您的200次响应之间的差异),并检查是否与您获得的“双重更新”有任何基于时间的相关性,作为第一个度量,以验证这是原因还是其他原因?是的,我做了上述操作,我发现的相关性是所有“双重更新”发生这种情况是因为初始webhook总是需要12秒以上的时间来发送一个200 OK。我正在发送多条消息以响应我方法中的第一个webhook,我猜在我的应用程序发送完所有这些消息后,它只会返回200 OK。似乎唯一的加速方法就是使用延迟作业,从而更快地发送200 OK响应?你找到原因了吗?我也面临同样的问题