YOU WILL REGRET THIS
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

YOU WILL REGRET THIS

on

  • 1,162 views

A lightning talk given at the London Erlang Factory in 2011, discussing Erlang anti-patterns seen in real world applications.

A lightning talk given at the London Erlang Factory in 2011, discussing Erlang anti-patterns seen in real world applications.

Statistics

Views

Total Views
1,162
Views on SlideShare
1,162
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

YOU WILL REGRET THIS Presentation Transcript

  • 1. YOU WILL REGRET THIS! My Other Mood is Even More AngryFriday, June 10, 2011
  • 2. IM GONNA TELL YOU A STORY In which I tell you how to behave - how dare I?Friday, June 10, 2011
  • 3. SOCKET.IO-ERLANG • Developed by Yurii Rashkovskii, Omar Yasin, Fred Hebert (me) • Used as a base demo app for this presentation • Allows to write neat front-ends for conversational websitesFriday, June 10, 2011
  • 4. BIZARRO SOCKET.IO-ERLANG • Bad socket.io-erlang used for the presentation • Freely substitutes dependencies and actual code for whatever purpose I haveFriday, June 10, 2011
  • 5. APP STRUCTUREFriday, June 10, 2011
  • 6. APP STRUCTURE Bunch of supervisorsFriday, June 10, 2011
  • 7. APP STRUCTURE Bunch of supervisors web serverFriday, June 10, 2011
  • 8. APP STRUCTURE Bunch of supervisors transport handlers web serverFriday, June 10, 2011
  • 9. APP STRUCTURE Bunch of supervisors Client code attaches here transport handlers web serverFriday, June 10, 2011
  • 10. WE USE A WEB SERVER • We need a web server (the slides title says just that (and also the previous slide)) • Oh, Carrying parameters and a connection around is annoying! • Lets use parametrised modules!Friday, June 10, 2011
  • 11. PARAMETRISED MODULES -­‐module(test_module,  [Param1]). some_method()  -­‐>  Param1. Equivalent to: -­‐module(test_non_pmod). some_method(Param1)  -­‐>  Param1.Friday, June 10, 2011
  • 12. PARAMETRISED MODULES 1> X = test_module:new(horror), X:some_method(). horror 2> test_non_pmod:some_method(sane). saneFriday, June 10, 2011
  • 13. PARAMETRISED MODULES • They are great! • We can use them as if they were objects! • They let us carry everything as one large parameter! • Lets do this!Friday, June 10, 2011
  • 14. PARAMETRISED MODULES • They are great! • We can use them as if they were objects! • They let us carry everything as one large parameter! • Lets do this!Friday, June 10, 2011
  • 15. What?Friday, June 10, 2011
  • 16. ILL TELL YOU WHAT 3> dbg:tp({X, some_method, 0}, [...]). ** exception error: no case clause matching {test_module,horror} 4> dbg:tp({test_module, some_method, 0}, [...]). * never matches anything * 5> dbg:tp({test_module, some_method, 1}, [...]). * will actually match stuff *Friday, June 10, 2011
  • 17. What is this I dont even...Friday, June 10, 2011
  • 18. ILL TELL YOU WHAT • The parameters are global and they ghost values, become implicit function arguments. Errors out of nowhere. • Theyre based on a old fun hack ({Mod, Fun}:(Args)) • They mess up the concept of arity • They mess up tracing (previous slide!) • They were added because some library accepts callback modules and nothing else but might still need state around. No other reason.Friday, June 10, 2011
  • 19. Ill use them anyway (in my server)Friday, June 10, 2011
  • 20. YOU PROBABLY SHOULDNT But you might not have a choice, so lets keep goingFriday, June 10, 2011
  • 21. WHAT ELSE DO WE HAVE? •A supervision tree, of course! • Some of the supervisors are tricky and must interact with servers and dynamic children and ... • Who starts who? By which API? • We could probably just forget about supervisors, link stuff together and make it simpler • Lets do this!Friday, June 10, 2011
  • 22. IN THIS VERY SLIDE I PRETEND I MAKE THE CHANGESFriday, June 10, 2011
  • 23. APP STRUCTUREFriday, June 10, 2011
  • 24. APP STRUCTURE transport handlers were moved and no longer need a supervisor. They only use links. The code is more straightforward!Friday, June 10, 2011
  • 25. APP STRUCTURE transport handlers were moved and no longer need a supervisor. They only use links. The code is more straightforward!Friday, June 10, 2011
  • 26. What? ... my code is so much easier to read now!Friday, June 10, 2011
  • 27. ILL TELL YOU WHAT • You need to add ad-hoc start/restart policies and make sure orderly shutdowns work fine with just links. Care to add tests? • You can no longer benefit from systools application upgrades and downgrades as they depend on supervisors • You will need to take your app down!Friday, June 10, 2011
  • 28. Its okay, Ill do rolling upgrades through all nodes this should avoid downtimeFriday, June 10, 2011
  • 29. NOT WITH LIVE SESSIONS! Nobody likes to be disconnected during a conversation! Would you disconnect this guy?Friday, June 10, 2011
  • 30. Stolen from Yuriis talk earlier today NOT WITH LIVE SESSIONS! Nobody likes to be disconnected!Friday, June 10, 2011
  • 31. Stolen from Yuriis talk earlier today NOT WITH LIVE SESSIONS! Nobody likes to be disconnected!Friday, June 10, 2011
  • 32. Youre killing me. Ill leave the change in. Code is meant to be read first!Friday, June 10, 2011
  • 33. OK, AS LONG AS YOU LISTEN TO THE NEXT POINTFriday, June 10, 2011
  • 34. SURE, IM HAPPY WITH MY APP • Its all done in OTP • Now Easier to read • Uses parametrized modules, hell yes! • Its time to start it! • Lets do this!Friday, June 10, 2011
  • 35. THIS IS GONNA BE FUN main(_) -> appmon:start(), sasl:start(normal, []), socketio:start(normal,[]), {ok, Pid} = socketio_listener:start([ {http_port, 7878}, {default_http_handler,?MODULE}]), EventMgr = socketio_listener:event_manager(Pid), ok = gen_event:add_handler(EventMgr, ?MODULE,[]), receive _ -> ok end. And it works! (believe me)Friday, June 10, 2011
  • 36. THIS IS GONNA BE FUN main(_) -> appmon:start(), sasl:start(normal, []), socketio:start(normal,[]), {ok, Pid} = socketio_listener:start([ {http_port, 7878}, {default_http_handler,?MODULE}]), EventMgr = socketio_listener:event_manager(Pid), ok = gen_event:add_handler(EventMgr, ?MODULE,[]), receive _ -> ok end. And it works! (believe me)Friday, June 10, 2011
  • 37. YOU, AGAIN!? You are worse than clippy What is it this time?Friday, June 10, 2011
  • 38. ILL TELL YOU WHAT • The VM starts all applications under the Application Controller • Starting one outside of it means it is not supervised by it • No app failure strategy (permanent, transient, temporary) • No access to env variables • No respect of start phases or dependenciesFriday, June 10, 2011
  • 39. AND IT GETS WORSE • With bad default values (or overly defensive code) for env variables, bad things happen... • In this case, infinitely many web sockets opened for each client (before a patch to change that, because I forgot to listen to this hint)Friday, June 10, 2011
  • 40. DO THIS INSTEAD main(_) -> appmon:start(), application:start(sasl), application:start(misultin), application:start(socketio), {ok, Pid} = socketio_listener:start([ {http_port, 7878}, {default_http_handler,?MODULE}]), EventMgr = socketio_listener:event_manager(Pid), ok = gen_event:add_handler(EventMgr, ?MODULE,[]), receive _ -> ok end. And it works better! (believe me)Friday, June 10, 2011
  • 41. Oh...Friday, June 10, 2011
  • 42. RIGHT Your OTP code is not worth much without thatFriday, June 10, 2011
  • 43. One more thing...Friday, June 10, 2011
  • 44. DONT LISTEN TO ME If your product might not ship because of this. Making it work is #1. Making it pretty is not.Friday, June 10, 2011
  • 45. HAPPY HACKING Hopefully you wont regret thisFriday, June 10, 2011