Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Considering Porting App from .NET to Erlang - need advice [closed]

I am looking at Erlang for a future version of a distributed soft-real-time hosted web-based telephony app (i.e. Erlang looks like absolutely the perfect choice for this kind of app). I come from a .NET background and the current version of this app uses a combination of C#, WCF and JQuery to deliver the service. I now need Erlang to allow me to add extra 9s to my up-time and to allow me to get more bang for my server bucks.

Previously I'd set up a development process here combining VS.NET, GIT, TeamCity and auto-deployment of MSI files to the various environments we maintain. It's not perfect, but we're all now pretty comfortable with it. I'm wondering whether a process like we have is even appropriate for such a radically different technology stack (LYME)?

I'm confident that all of the programming challenges we previously solved using .NET can be better solved in less code with Erlang, so I'm completely sold on the language choice. What I don't yet understand from reading the Pragmatic and O'Reilly books on Erlang, is how I should adapt my software engineering and application life-cycle management (ALM) processes to suit the new platform. I see that in-place code updates could make my (and my testing and ops team's) life much easier (compared to the god-awful misery of trying to deploy MSI files across a windows network) but I am not sure how things should change when I use Erlang.

How would you:

  • do continuous integration in Erlang (is it commonly used?)
  • use it during a QA cycle (we often run concurrent topic branches using GIT, that get their own mini-QA cycle, so they all get deployed into a test environment)
  • build and distribute your code to DEV, TEST, UAT, STAGING, and PROD environments
  • integrate code generation phases into your build cycle (we currently use MSBUILD + T4 templates)
  • centralize logging for a bunch of different servers (we currently use Log4Net, MSMQ, etc)
  • do alerting with tools like SCOM
  • determine whether someone/something has misconfigured your production servers
  • allow production hot-fixes only after adequate QA (only by authorized personnel)
  • profile the performance (computation and communication) of your apps
  • interact with windows-based active directory servers

I guess I need to know what worked for you and why! What tools and frameworks did you use? What did you try that failed? What would you do differently if you could start over, knowing what you know now?

like image 219
Andrew Matthews Avatar asked Nov 23 '10 23:11

Andrew Matthews


1 Answers

Whoa, what a long post. First, you should be aware that the 99.9% and better kool-aid is a bit dangerous to drink while blind. Yes, you can get some astounding stability figures, but you need to write your program in a way facilitating this. It does not come for free. It does not happen by magic either. Your application must be designed in a way such that other subsystems recover. OTP will help you a lot - but it still takes time to learn.

Continuous integration: Easily done. If you can call rebar or make through your build-bot you are probably set here already. Look into eunit, cover and Erlang QuickCheck (the mini variant is free for starters) - all can be run from rebar.

QA Cycle: I have not had any problems here. Again, if using rebar you can build embedded releases that are minimized erlang vm's you can copy anywhere and run (they are self-contained). You can even hot deploy fixes to such a system pretty easily by altering the code path a bit so you have an overlay of newer fixes. Your options are numerous. Git already help you here a lot.

Environmentalization: Easily done.

Logging centralization: Look into SASL and the error_logger. You can do anything you want here.

Alerting: The system can be probed for all you need (introspection is strong in Erlang). But you might have to code a bit to hook it up to the system of your choice.

Misconfiguration: Configuration files are Erlang terms. If it can be computed, it can be done.

Security: Limit who has access. It is a people problem, not a technical one in my opinion.

Profiling: cprof, cover, eprof, fprof, instrument + a couple of distributed systems for doing the same. Random sampling is also easy (introspection is strong in Erlang).

Windows interaction: Dunno. (Bias: last time I used windows professionally was in 1998 or so).

Some personal observations:

Your largest problem might end up being that you try to cram Erlang into your existing process and it might resist. It is a new environment, so new approaches will be needed in places and you should expect to adapt and workaround limitations you find along the way. The general consensus is that it can work (it is working for several big sites).

It looks like you have a well-established and strict process. How much is that process allowed to be sacrificed to give way to a new kind of thinking?

Are your programmers willing to throw out almost all of their OO knowledge? If not, you will end with a social problem rather than a technical one. If they are like me however, they will cheer, clap in their hands and get a constant high by working with an interesting language solving an interesting problem in a new way.

How many Erlang-experienced programmers do you have? If you have rather few, then better cut your teeth on some smaller subsystems first and then work towards the larger goal. Getting the full benefit of the system takes months if not years. Getting partial benefit can be had in weeks though.

like image 112
I GIVE CRAP ANSWERS Avatar answered Oct 04 '22 15:10

I GIVE CRAP ANSWERS