如何为 RabbitMQ RPC 请求设置超时?

Posted

技术标签:

【中文标题】如何为 RabbitMQ RPC 请求设置超时?【英文标题】:How to set a timeout to a RabbitMQ RPC request? 【发布时间】:2020-04-13 21:45:25 【问题描述】:

在 AMQP (RabbitMQ) RPC 模型中向主题发布消息是否存在超时?

我不想等待很长时间(超时后)消费者对生产者消息的回答。

参考:RPC (Go RabbitMQ Client)

【问题讨论】:

【参考方案1】:

(示例代码使用streadway/amqp

您可以通过使用计时器来实现这一点,它可以尽可能短。然后使用 select 语句等待 RPC 响应和计时器通道:

func doRPC() ([]byte, error) 
    // ...RPC setup code
    timer := time.NewTimer(2 * time.Second)
    for 
        // waits until either a response from the RPC server
        // is available or the timer expires
        select 
        case msg := <-msgs: // msgs is of type <-chan amqp.Delivery
            if msg.CorrelationId == correlationID 
                return msg.Body, nil
            

        case <-timer.C:
            return nil, errors.New("waiting for RPC response timed out or was cancelled")
        
    

要让调用者控制超时,您可以使用上下文来代替计时器。它的工作方式相同,只是现在您在上下文Done() 频道上选择:


func caller() 
    // the caller can create a context with the desired timeout
    ctx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
    defer cancel()

    doRPC(ctx)


func doRPC(ctx context.Context) ([]byte, error) 
    // ...RPC setup code
    for 
        select 
        case msg := <-msgs: // msgs is of type <-chan amqp.Delivery
            if msg.CorrelationId == correlationID 
                return msg.Body, nil
            

        case <-ctx.Done():
            return nil, errors.New("waiting for RPC response timed out or was cancelled")
        
    

【讨论】:

以上是关于如何为 RabbitMQ RPC 请求设置超时?的主要内容,如果未能解决你的问题,请参考以下文章

如何为网站设置 JSON API 超时?

如何为一元 rpc 定义响应标头

如何为不接受取消令牌的异步函数设置超时?

如何为 JAX-WS Web 服务客户端设置超时?

如何为分布式系统优雅的更换RPC

如何为 AndroidAsync websockets 设置超时?