Remix.run Logo
▲ bob1029 3 hours ago

I strongly recommend never using functions as a service unless you genuinely have some client edge compute requirement that absolutely cannot be solved via some other means.

Everything about running software is made more difficult this way. You might think it would make certain infrastructure aspects easier, but it just changes the semantics of the same problem. It's the same quantity of mess to clean up, but now it's in these really weird piles that are often much harder to access.

> up to 128 concurrent requests per environment

I am fairly confident I could support more capacity with a single t3a.nano instance.

▲joshstrange 2 hours ago | parent | next [-]

I agree and disagree with this. I run multiple software platforms that are incredibly bursty, to the level of "no traffic for 10 months out of the year, small traffic of 1-1.5 months, medium for <1 week, and high for 1-2 days" (event-based, like a physical in-person event, not events in the software sense). While I agree lambdas are fiddly and I have some reasons to move off them, they also are kind of perfect for my use case from a billing perspective. Even a t3a.nano would have cost more and not scaled quite as easily as I needed.

All that said, there are times I regret my lambda decision and would prefer just a EC2 host even if it cost more. Deployment would be easier/simpler. I've spent considerable time to improve my deploy process and lower the deploy times but it's still ~2-3min from tag -> deployed which I know I could do faster on just a VM. Also everything gets harder in a lambda, packages/binaries, logging, monitoring, etc.

▲badatnames 3 hours ago | parent | prev | next [-]

These one-sided arguments come up every time there's a Lambda thread. They're useful and easily cheaper almost anywhere you have sparse compute or RAM requirements, even for heavyweight tasks like transcoding. A t3.nano meanwhile can simultaneously be overpriced ($3.50 for an idle task) and a bottleneck (30Mbit/s sustained network) in just as many places as a Lambda could be applied incorrectly.

▲ryandvm 2 hours ago | parent [-]

They're also good for extremely bursty loads. I use Lambdas extensively for a radar imagery API that delivers the images for an Android live wallpaper that shows weather radar.

That particular use case can go from hardly any traffic at all to a hurricane of traffic during something like, well, a hurricane.

For consistent processing loads, I think I could save money by just running on dedicated EC2 instances, but you cannot beat the instant scale of Lambdas.

Shameless plug: https://play.google.com/store/apps/details?id=app.radarlove....

▲CharlieDigital an hour ago | parent [-]

There's nothing particularly special about Lambda's scaling. You can do the same with GCP Cloud Run[0] or Azure Container Apps[1]

Specify the maximum number of allowed instances and maximum concurrency per instance. Optionally configure more targeted scale rules. It will scale it from 0 - n as needed.

[0] https://docs.cloud.google.com/run/docs/about-instance-autosc...

[1] https://learn.microsoft.com/en-us/azure/container-apps/scale...

▲badatnames an hour ago | parent [-]

So long as you don't count >2 orders of magnitude difference in scaleup time as particularly special..

▲CharlieDigital an hour ago | parent [-]

That's not how it works since each instance can handle multiple requests (up to 1000 per instance). So you may set this to scale at say 75% load level.

Indeed if you configured each instance as a single threaded handler, you will not have fun.

▲vermilingua 3 hours ago | parent | prev | next [-]

I seem to have had the opposite experience. Using Lambda (I can't speak for many of the other FaaS platforms) is so straightforward to me that there need to be some strong arguments for hosting code/containers in my projects.

My guess is that the IaC is the special sauce that's missing; you do need to go all in with some IaC solution to make using Lambda easy, but it doesn't take a lot of it to make it slick.

Cost/compute is obviously strictly worse for FaaS, but most web workloads don't _really_ need to be optimal.

▲CharlieDigital an hour ago | parent [-]

If you haven't tried Azure Container Apps or GCP Cloud Run, I would strongly recommend trying them at least once deploying any standard web API app in your language of choice, just for your edification.

No adapters needed; just write a web API and ship it. Public URL gets assigned and its ready for use. Code works locally with no special adapters, emulators, or tooling needed. Need to support another cloud plat tomorrow? Ship the same container. Moving it to self-managed K8s? Same container.

▲ekorondy an hour ago | parent [-]

[flagged]

▲nater5000 an hour ago | parent | prev | next [-]

This is like the Normal Distribution meme: naively, using Lambdas for these services seems like an obvious choice. Once you start getting into the weeds of it, though, you start to realize that there are real trade-offs which make Lambda not as obvious a choice as they appear at first glance. But once you've worked through those pains and complexity, you end up realizing that there's no free lunch and Lambda is actually a great service for these tasks, all things considered.

>> up to 128 concurrent requests per environment > I am fairly confident I could support more capacity with a single t3a.nano instance.

Don't forget that this is referring to 128 concurrent requests per environment. By default, an AWS account can run up to 1,000 concurrent Lambdas, and that number can be increased with support requests.

Of course, the REAL win is that you only pay for what you use. Your t3a.nano is costing you 24/7, and if you want it to scale on demand, your stack will get very complicated very quickly. Lambdas just scale "for free".

▲otterley 3 hours ago | parent | prev | next [-]

> I strongly recommend never using functions as a service unless you genuinely have some client edge compute requirement that absolutely cannot be solved via some other means.

Why? What’s the downside? Are you taking the benefits into account in your calculus? This sort of general, input-free recommendation is junior level thinking at best.

> I am fairly confident I could support more capacity with a single t3a.nano instance.

It depends on what resources those connections are using (memory, CPU, I/O, network). What actual work is being done?

▲hmokiguess 2 hours ago | parent | prev [-]

> unless you genuinely have some client edge compute requirement that absolutely cannot be solved via some other means

You make it sound like these cases are rare, not sure what kind of work you do but there are markets of all sizes in many different use cases out there.

I feel like what you wanted to say was "I haven't found a need for them" as opposed to "Stay away from it"

Maybe you're trying to say something else we don't know because we don't have your backstory either, did folks at your work tried pushing it for scenarios in which they became a problem? Share that instead as it brings a lot more value to the readers, otherwise it sounds like you are trying to go for a weird flex.

▲CharlieDigital an hour ago | parent | next [-]

I would agree with OP with "stay away".

The Google paper Towards Modern Development of Cloud Applications[0] does a great job explaining why.

TL;DR the case they make against micro-services architectures (which Lambda encourages):

    1. It hurts performance
    2. It hurts correctness
    3. It is hard to manage
    4. It freezes APIs
    5. It slows down application development
For even a moderately complex system, spreading logic out over multiple discrete runtimes doesn't make sense; instantly run into each of the 5 points. The only times I've found functions useful is truly single-point behavior where we were running some logic connected to CloudFront on each request for some header parsing.

It is certainly possible to write a monolith in Lambda as well, but then that would be bad architecture and a bad fit and I suppose why they are now introducing this new model that is more like GCP Cloud Run or Azure Container Apps.

[0] https://sigops.org/s/conferences/hotos/2023/papers/ghemawat....

▲bbg2401 an hour ago | parent | prev [-]

They said what they wanted to say, and it was quite clear. The person who commented suggests we don't use client-edge compute unless we have a specific need for it, i.e., don't treat it as a default due to its apparent simplicity up front.

You've taken it in a rather odd direction with the request for a framing more palatable to you.