第三方服务不断发送api,多次触发该函数



我们正在使用elixir;我建立了一个叫做receive_message的函数,这个函数从第三方服务(360Dialog)接收API,这个函数包含另一个函数调用,如果它成功,它将发送200响应;如果由于任何原因导致内部函数失效,则不会发送响应200。我现在的问题是:第三方API期望立即得到200响应,但是如果由于任何原因,我的内部函数崩溃了,我就无法通过重试再一次接收API调用。原来的函数是这样的

@spec receive_message(Plug.Conn.t(), map) :: Plug.Conn.t()
def receive_message(conn, _params) do
@spec deliver(%{:conversation => any, optional(any) => any}) :: maybe_improper_list
Messenger.deliver(conn.assigns.message)
send_resp(conn, 200, "")
end

这创建了重复的消息,因为360dialog期望立即得到200,如果没有发生,他们会继续发送重试。我试着在调用消息和发送响应之间切换,像这样

@spec receive_message(Plug.Conn.t(), map) :: Plug.Conn.t()
def receive_message(conn, _params) do
send_resp(conn, 200, "")
enter code here
@spec deliver(%{:conversation => any, optional(any) => any}) :: maybe_improper_list
Messenger.deliver(conn.assigns.message)
end

它工作,没有更多的重复消息但是我不能保持这样,因为如果Messenger.deliver坏了,因为任何原因,我希望360Dialg再次重试。有什么好主意吗?

您没有共享Messenger.deliver/1的规范,所以我无法给出确切的答案,但一般来说,函数通常通过返回操作的结果来报告成功/错误。你需要检查它并做出相应的反应。稍微靠近下面的行就可以了

def receive_message(conn, _params) do
case Messenger.deliver(conn.assigns.message) do
:ok -> send_resp(conn, 200, "")
:error -> log_and_retry_or_skip
end
end

Messenger.deliver/1是异步的情况下,它会更复杂,你需要等待结果,但一般模式在上面。

最新更新