我有一个代理可以防止服务器因请求而过载。 客户端将其请求发送到代理,代理确定是否将请求传递给服务器。
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).
答案 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)
从邮件处理单独接收邮件
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).
或者使用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).
后者有点扁平,但在您决定更改邮件格式时可能会出现问题。
PS:为什么你不使用OTP?