[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"navigation":3,"\u002Farticles\u002Fclever-but-risky-elixir-patterns":30,"\u002Farticles\u002Fclever-but-risky-elixir-patterns-surround":300},[4],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Articles","\u002Farticles","articles",[9,13,17,21,25],{"title":10,"path":11,"stem":12},"Automated Deployment using Github Actions","\u002Farticles\u002Fautomated-deployment-using-github-actions","articles\u002Fautomated-deployment-using-github-actions",{"title":14,"path":15,"stem":16},"Automatically Logout All Tab Using VueUse Broadcast Channel with Pinia","\u002Farticles\u002Fautomatically-logout-all-tab-using-vueuse-broadcast-channel-with-pinia","articles\u002Fautomatically-logout-all-tab-using-vueuse-broadcast-channel-with-pinia",{"title":18,"path":19,"stem":20},"Clever but risky Elixir patterns","\u002Farticles\u002Fclever-but-risky-elixir-patterns","articles\u002Fclever-but-risky-elixir-patterns",{"title":22,"path":23,"stem":24},"Hide your NGINX header on Ubuntu","\u002Farticles\u002Fhide-your-nginx-header-on-ubuntu","articles\u002Fhide-your-nginx-header-on-ubuntu",{"title":26,"path":27,"stem":28},"Technical Debt","\u002Farticles\u002Ftechnical-debt","articles\u002Ftechnical-debt",false,{"id":31,"title":18,"author":32,"body":36,"date":292,"description":293,"extension":294,"image":295,"meta":296,"minRead":67,"navigation":297,"path":19,"seo":298,"stem":20,"__hash__":299},"articles\u002Farticles\u002Fclever-but-risky-elixir-patterns.md",{"name":33,"avatar":34},"Roslan Saidi",{"src":35,"alt":33},"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13043860?v=4",{"type":37,"value":38,"toc":287},"minimark",[39,43,99,106,111,114,118,172,175,276,280,283],[40,41,42],"p",{},"In Elixir, we create a process that can wait for a specific message:",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-elixir shiki shiki-themes material-theme-lighter github-light github-dark","receive do\n  {:ok, data} -> data\nend\n","elixir","",[51,52,53,65,93],"code",{"__ignoreMap":49},[54,55,58,62],"span",{"class":56,"line":57},"line",1,[54,59,61],{"class":60},"sVHd0","receive",[54,63,64],{"class":60}," do\n",[54,66,68,72,76,79,83,86,90],{"class":56,"line":67},2,[54,69,71],{"class":70},"sP7_E","  {",[54,73,75],{"class":74},"s39Yj",":ok",[54,77,78],{"class":70},",",[54,80,82],{"class":81},"su5hD"," data",[54,84,85],{"class":70},"}",[54,87,89],{"class":88},"smGrS"," ->",[54,91,92],{"class":81}," data\n",[54,94,96],{"class":56,"line":95},3,[54,97,98],{"class":60},"end\n",[40,100,101,102,105],{},"Kinda looks simple. But the weird part is, if the mailbox already has many other messages that do not match ",[51,103,104],{},"{:ok, data}",", Elixir will scan through them one by one until it finds the matching one. Those unmatched messages are not removed. So over time, the process mailbox can fill with useless messages and every receive becomes slower. That is what makes it risky:\nthe code looks correct, but the process becomes slow quietly.",[107,108,110],"h3",{"id":109},"why-some-of-us-miss-it","Why some of us miss it?",[40,112,113],{},"We often think “receive waits for the next correct message\". But the real behaviour is “receive searches through all messages until it finds the correct one\".",[107,115,117],{"id":116},"simple-use-case","Simple use case",[44,119,121],{"className":46,"code":120,"language":48,"meta":49,"style":49},"def wait_result do\n  receive do\n    {:result, value} -> value\n  end\nend\n",[51,122,123,134,141,161,167],{"__ignoreMap":49},[54,124,125,128,132],{"class":56,"line":57},[54,126,127],{"class":60},"def",[54,129,131],{"class":130},"sGLFI"," wait_result",[54,133,64],{"class":60},[54,135,136,139],{"class":56,"line":67},[54,137,138],{"class":60},"  receive",[54,140,64],{"class":60},[54,142,143,146,149,151,154,156,158],{"class":56,"line":95},[54,144,145],{"class":70},"    {",[54,147,148],{"class":74},":result",[54,150,78],{"class":70},[54,152,153],{"class":81}," value",[54,155,85],{"class":70},[54,157,89],{"class":88},[54,159,160],{"class":81}," value\n",[54,162,164],{"class":56,"line":163},4,[54,165,166],{"class":60},"  end\n",[54,168,170],{"class":56,"line":169},5,[54,171,98],{"class":60},[40,173,174],{},"Now imagine the process receives many unrelated messages first:",[44,176,178],{"className":46,"code":177,"language":48,"meta":49,"style":49},"send(pid, {:log, \"start\"})\nsend(pid, {:heartbeat})\nsend(pid, {:debug, 123})\nsend(pid, {:result, 42})\n",[51,179,180,215,232,255],{"__ignoreMap":49},[54,181,182,185,188,191,193,196,199,201,205,209,212],{"class":56,"line":57},[54,183,184],{"class":130},"send",[54,186,187],{"class":70},"(",[54,189,190],{"class":81},"pid",[54,192,78],{"class":70},[54,194,195],{"class":70}," {",[54,197,198],{"class":74},":log",[54,200,78],{"class":70},[54,202,204],{"class":203},"sjJ54"," \"",[54,206,208],{"class":207},"s_sjI","start",[54,210,211],{"class":203},"\"",[54,213,214],{"class":70},"})\n",[54,216,217,219,221,223,225,227,230],{"class":56,"line":67},[54,218,184],{"class":130},[54,220,187],{"class":70},[54,222,190],{"class":81},[54,224,78],{"class":70},[54,226,195],{"class":70},[54,228,229],{"class":74},":heartbeat",[54,231,214],{"class":70},[54,233,234,236,238,240,242,244,247,249,253],{"class":56,"line":95},[54,235,184],{"class":130},[54,237,187],{"class":70},[54,239,190],{"class":81},[54,241,78],{"class":70},[54,243,195],{"class":70},[54,245,246],{"class":74},":debug",[54,248,78],{"class":70},[54,250,252],{"class":251},"srdBf"," 123",[54,254,214],{"class":70},[54,256,257,259,261,263,265,267,269,271,274],{"class":56,"line":163},[54,258,184],{"class":130},[54,260,187],{"class":70},[54,262,190],{"class":81},[54,264,78],{"class":70},[54,266,195],{"class":70},[54,268,148],{"class":74},[54,270,78],{"class":70},[54,272,273],{"class":251}," 42",[54,275,214],{"class":70},[107,277,279],{"id":278},"tldr","TLDR",[40,281,282],{},"Selective receive is risky because it fails silently. The code still works, but the mailbox slowly poisons the process.",[284,285,286],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":49,"searchDepth":67,"depth":67,"links":288},[289,290,291],{"id":109,"depth":95,"text":110},{"id":116,"depth":95,"text":117},{"id":278,"depth":95,"text":279},"2026-04-17","Selective receive is a hidden Elixir behavior where a process looks through its waiting messages for one match, while the other messages stay there and can slowly make the process slower.","md","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1646514626278-ff2ae5e88f0d?q=80&w=1174&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D",{},true,{"title":18,"description":293},"ThijfxWjzCMuP0rYbcV_huB-aJRCuqoS9j54ukYAJZE",[301,303],{"title":14,"path":15,"stem":16,"description":302,"children":-1},"Keep every tab in sync when a user signs out — one logout closes them all in Nuxt using Broadcast Channel + Pinia.",{"title":22,"path":23,"stem":24,"description":304,"children":-1},"How to turn off or mask the NGINX server header on Ubuntu to keep the server details private.",1776755308434]