Erlang丢弃消息

时间:2015-03-06 23:05:04

标签: erlang message

我有一个代理可以防止服务器因请求而过载。 客户端将其请求发送到代理,代理确定是否将请求传递给服务器。

NrOfReq是服务器正在处理的当前请求数。 MaxReq是服务器之前可以处理的最大请求数 邮箱已满。

每次服务器处理完请求时,它都会发送ready_to_serve原子 代理人。

每当在when-keyword之后的守卫是假的时候,我想从客户端删除该邮件并阻止它在代理邮箱中结束。 我怎么能这样做?

proxy(ServerPid, NrOfReq, MaxReq) ->
    receive
            {client_request, Request, ClientPid} when NrOfReq < MaxReq ->
                    New = NrOfReq + 1,
                    ServerPid ! {Request, ClientPid, self()};
            ready_to_serve ->
                    New = NrOfReq - 1
    end,
    proxy(ServerPid, New, MaxReq).

2 个答案:

答案 0 :(得分:0)

我从未尝试过你的提议,在我这边我会使用2个子句进行循环:

proxy(ServerPid, MaxReq, MaxReq) ->
    receive
            ready_to_serve ->
                    New = NrOfReq - 1
    end,
    proxy(ServerPid, New, MaxReq);

proxy(ServerPid, NrOfReq, MaxReq) ->
    receive
        {client_request, Request, ClientPid} ->
                New = NrOfReq + 1,
                ServerPid ! {Request, ClientPid, self()};
        ready_to_serve ->
                New = NrOfReq - 1
    end,
    proxy(ServerPid, New, MaxReq).

这个代理对我来说很奇怪。我在Erlang中经常看到的模式是为每个客户端生成1个服务器,并且有专门的流程来生成这些服务器,管理存储......

答案 1 :(得分:0)

  1. 从邮件处理单独接收邮件

    proxy(ServerPid, NrOfReq, MaxReq) ->
        receive
            {client_request, Request, ClientPid} ->
                    if 
                        NrOfReq < MaxReq ->
                            New = NrOfReq + 1,
                            ServerPid ! {Request, ClientPid, self()};
                        true ->
                            'message-dropped';
                    end;
            ready_to_serve ->
                    New = NrOfReq - 1
    end,
    proxy(ServerPid, New, MaxReq).
    
  2. 或者使用fallback子句删除消息

    proxy(ServerPid, NrOfReq, MaxReq) ->
        receive
            {client_request, Request, ClientPid} when NrOfReq < MaxReq ->
                New = NrOfReq + 1,
                ServerPid ! {Request, ClientPid, self()};
            {client_request, Request, ClientPid} when NrOfReq >= MaxReq  ->
                'message-dropped';
            ready_to_serve ->
                New = NrOfReq - 1
    end,
    proxy(ServerPid, New, MaxReq).
    
  3. 后者有点扁平,但在您决定更改邮件格式时可能会出现问题。

    PS:为什么你不使用OTP?