I want to write this post about my views about serverless architecture (specifically AWS Lambda) which all cloud service providers like AWS are promoting as “holy grail” for solving all problems. This post is targeting developers who understand that every technology has a limitation and its wise to make an informed decision
Before I start my discussion around this want to state some facts so that we can have a fruitful discussion.
a. All companies including cloud service providers have to make money
b. All companies are afraid of competition and do not want to loose their customers
c. There is no branch of engineering where “one site fits all” approach works.
d. No matter what tools an engineer chooses when you cant find a solution “go back to basics” is the best approach.
e. Lambda architecture in the context of “AWS” is different from lambda architecture in general as many problem with this architecture are AWS specific only.
If you want to understand some issues with “Lambda architecture”
https://www.oreilly.com/ideas/questioning-the-lambda-architecture
Coming to the point Many attempts have been made in the past to find one “holy grail” to find solutions to teething problems. Let’s look at some of these
Problem 1– lets take operating systems Question is why do we have multiple operating systems? Why noone is able to solve “all the problems under sun”? Why so many
Problem 2– Write multiple programs for different OS even if program does same thing. Java solved this problem.Don’t worry about garbage collection, no worry about performance or underlying platforms. After 20 years of research and billions of dollars we only have more languages. If Java would have solved all the problems that it targeted we will never have to learn “node.js”
Problem 3. Learn multiple languages for front-end and backend development. GWT from house of google did solve it. great !!. Where is it now? Why did google decide to stick to Javascript for front end development and created angular?
Problem 4– Integration. In vast variety of protocols and hundreds of disparate systems in a sizeable organization Integration is a major problem. Hence birth of ESB. Where is it now? How many start ups use this? haven’t heard or found anyone
Problem 5 – Modeling business processes. Rule Engine tried to solve all problems under the sun and be de-facto expert systems. No-doubt it is formidable technology but does it work in most of the scenarios. Answer is a resounding NO.
I can go on and on but you know what I am implying. One size does not fit all. Never have, never will. Probably there will be enough research into AI that technology stack and architecture can be determined by a program itself but I do not see that happening anytime soon.
There are many ways you can architect your applications. Serverless is one of those architectures.In this architecture you do not manage your own resources but someone else does. When and how many are decided by AWS for you. you do not get to choose your operating system, runtime versions etc etc.
Serverless architecture also tries to create an “illusion” that all my problems related to understanding processes behavior and problems with distributed systems will go away and it will scale on its own without “paying any cost”.
Before you find this approach or so called “architecture” fascinating give a call to your friend working for Amazon and ask how many amazon folks are actually using this. So far I have found none. Or even if they tried they do not understand its internals. Can you imagine lot of people in Amazon use “Oracle”. so much for their AWS offerings
Some people have written lengthy articles about Lambdas and its problems. Try to see if you have found answers to questions raised.
https://www.datawire.io/3-reasons-aws-lambda-not-ready-prime-time/
arguments in favor of lambda:
http://thenewstack.io/amazon-web-services-isnt-winning-problems-poses/
There is definitely logic in arguments posted in above blog but I see serious fundamental issue in writers approach of “why do I need to know this”. What kind of approach is this? One that I do not agree with. Knowing things in detail makes you better than competition and more adapt at solving problems. Knowing things help you solve critical technical issues and innovate. Yes its effort so what. AWS did not come out of thin air. It adopted many architectural solutions like Dynamo, RDS, Kinesis they are all based on cutting edge research papers.
To be more straight forward there are some points you need to be careful about while using Lambda architecture.
- Your application will be difficult to debug
- Encounter bugs which will be extremely hard to debug simply because your production environment will be very different from your local machine and you can never replicate it
- Poor Error reporting. already shared a blog
- Lambda warm up time. For batch processing lambda seems absolutely appropriate but for scalable real-time application? Well good luck if it works for you.
- Timeouts. Lambda will always have a time-out which means that if your code takes more time then defined time-out lambda will never run and keep throwing exceptions. So keep this carefully in mind especially when making external HTTP calls. Even more serious problem is the fact that Lambda will cool down when there is not much to process. This logic of cool down is somewhere hidden without much detail.
- Multiple environments – Create multiple lambda function..hell with code reuse
- Application state – Well forget this as lambda has to be stateless. You have absolutely no control on when a process runs and stops.
- JVM Optimizations – It also needs to be kept in mind that in Java techniques like JIT might be of no use in case of lambda functions. so all JVM optimizations will go out of the window.
- Throttling – This is something we have faced recently. Throttling limits are absolutely ridiculous for high traffic apps. Yes its a soft limit you can raise requests but isn’t it contradictory to auto-scaling part. I thought this was the problem Lambda was solving in first place.
Bottom line is pretty simple. AWS Lambda is a great tool provided you use it wisely just like any other technology
- you are fine with limited language support for Lambda.
- you know how to deal with lambda limitations. timeouts, filepaths, limited memory, sudden restarts, multiple copies of same code, etc.
- you want to avoid and for good reasons complexity involved with developing distributed systems
- analyzing your process performance is beyond your skills. e.g. you have no idea of JVM tuning
- You are OK with Open-JDK.
- you can be reasonably that your process will never hung or crash or have memory leak because you wont be able to login to machine and analyze dump using some advanced tool.