J'ai une source de données qui produit des points à un taux potentiellement élevé, et j'aimerais effectuer une opération qui peut prendre du temps sur chaque point ; mais je voudrais aussi que le système se dégrade gracieusement lorsqu'il est surchargé, en abandonnant les points de données en excès.
Pour autant que je sache, l'utilisation d'un gen_event ne permet jamais de sauter des événements. Conceptuellement, ce que je voudrais que le gen_event fasse, c'est abandonner tous les événements en attente, sauf les plus récents, avant de relancer les gestionnaires.
Y a-t-il un moyen de faire cela avec l'OTP standard ? ou y a-t-il une bonne raison pour laquelle je ne devrais pas procéder de cette façon ?
Jusqu'à présent, la meilleure solution que j'ai trouvée consiste à utiliser un gen_server et à compter sur le délai d'attente pour déclencher les événements coûteux :
-behaviour(gen_server).
init() ->
{ok, Pid} = gen_event:start_link(),
{ok, {Pid, none}}.
handle_call({add, H, A},_From,{Pid,Data}) ->
{reply, gen_event:add_handler(Pid,H,A), {Pid,Data}}.
handle_cast(Data,{Pid,_OldData}) ->
{noreply, {Pid,Data,0}}. % set timeout to 0
handle_info(timeout, {Pid,Data}) ->
gen_event:sync_notify(Pid,Data),
{noreply, {Pid,Data}}.
Cette approche est-elle correcte ? (notamment en ce qui concerne la supervision ? )