【发布时间】:2015-02-16 00:27:42
【问题描述】:
我还在学习 Erlang,所以我可能错了,但这就是我对进程消息队列的理解。
一个进程可能在它的主接收循环中,接收某些类型的消息,而稍后它可能被置于一个等待循环中,以在第二个循环中处理不同类型的消息。如果该进程将在第二个循环中接收用于第一个循环的消息,它会将它们放入队列中,暂时忽略它们,并且只处理它可以在当前循环中匹配的那些消息。现在如果它再次进入第一个接收循环,它将从头开始,并再次处理它可以匹配的消息。
现在我的问题是,如果这就是 Erlang 的工作方式并且我理解正确,那么当恶意进程发送一堆该进程永远不会处理的消息时会发生什么。队列最终会溢出,导致进程崩溃或者我应该如何处理?我将打出一个例子来说明我的意思。
现在,如果恶意程序获取了 Pid 并重复发送Pid ! {malicioudata, LotsOfData},这些消息是否会被过滤掉,因为它们永远不会被处理,或者它们只会堆积在队列中?
startproc() -> firstloop(InitValues).
firstloop(Values) ->
receive
retrieveinformation ->
WaitingList=askforinformation(),
retrieveloop(WaitingList);
dostuff ->
NewValues=doingstuff(),
firstloop(NewValues);
sendmeyourdata ->
sendingdata(Values),
firstloop(Values)
end.
retrieveloop([],Values) -> firstloop(Values).
retrieveloop(WaitingList,Values) ->
receive
{hereismyinformation,Id,MyInfo} ->
NewValues=dosomethingwithinfo(Id,MyInfo),
retrieveloop(lists:remove(Id,1,WaitingList),NewValues);
end.
【问题讨论】:
-
我猜在最好的情况下你会耗尽内存。但我的问题是; “恶意程序”如何与 erlang 的 PID 交互,攻击者是否嗅探了您节点的 cookie?在这种情况下,队列溢出是可能发生的最不坏的事情。在内存泄漏的情况下,如果 erlang 因内存问题而崩溃,那么您可以读取生成的崩溃转储。
-
@Evalon 在 vanilla 案例中,Erlang 被设计为在受信任的环境中运行。还有其他集群方法不做这个假设,但它们是附加组件,而不是普通的 Erlang 运行时配置。假设是您直接控制您正在操作的集群。在您认为“啊,这太糟糕了”之前,请意识到 在 Erlang 中进行套接字编程真的很容易。所以几乎任何你可以想象的微服务元服务都可以在 Erlang 中相对轻松地构建,构建集群的集群。
标签: erlang