This post from fly.io [1] has a pretty comprehensive survey of the tech available for running users' code safely. It's a good read.
I've been investigating something similar for a feature I want to launch. I'm currently leaning towards running users' code in Kubernetes using Firecracker or gVisor.
My main takeaway has been that while there are good solutions for isolating users' code, there's going to be a lot of worked involved in orchestrating it at scale. I.e. building and storing images, spinning up containers, managing storage, tracking/billing minutes and bandwidth, killing timed-out containers, etc. I have not found a good library for that. It seems like a good use-case for a Kubernetes operator, so I think that's what I'll wind up building.
One powerful way to deal with these problems is event sourcing. It's a reasonably elegant way to materialize a single application-specific cache based on many different data sources. Two great resources:
Makes sense. Why do you think Google and Amazon didn't pursue that approach for services like Cloud Functions and Lambda? Is there a trade-off or is it a matter of complexity?
Looks like a useful product! I think it's neat how you built it directly on Google Sheets. I'd love to hear more about why you made that decision (versus building an independent tool).
Some feedback on the landing page:
- Would be nice with a 2-3 minute demo video
- Put the screenshots (or demo video) closer to the top, so they're visible without scrolling
- Some of the copywriting could be clearer. For example: "Pre-built financial models for SaaS companies, with plug-and-play software built directly in Google Sheets" could be just "Financial models for SaaS companies, directly in Google Sheets"
Last year I read Masters of Doom by David Kushner after someone mentioned it on Hacker News. It was the best book I had read in a long time. It won't improve your skills, but I think it will motivate and inspire you to immerse yourself (if we're talking programming, doing small projects and getting feedback is a better way to improve your skills anyway).
I think you could find some inspiration in cryptocurrency exchanges. Most of them expose public websockets for prices, order books, trades, etc. They're high volume with lots of subscribers.
If you could tell me a little more about the data format, data volumes, number of subscribers, and how you get the data on the backend, I can try to give you some more concrete advice.
Checking for null on every method call certainly sounds nuts to me. Furthermore I would argue that doing so decreases consistence in your program. For example, in Objective-C I can count on nil being returned every time I call a method on a nil object. The opposite is true for other languages. The point is, it renders me able to make certain assumptions about how my code will behave, and thereby reduces the amount of code and tests I have to write.
Now if the language you're using behaves opposite of your wish, you're either using the wrong language or doing things the wrong way.
I guess I should elaborate on my statement about Wordpress because it came out wrong. I realize Wordpress is powerful, extremely powerful. What I meant was that this comes at an expense. This power means one has to deal with a very extensive API. This is great for someone who needs it (or knows it), but when building a personal site, dealing with an API requiring more than a couple of pages of documentation seems wrong (to me). Something like having to keep af functions.php with a 20+ sloc function to generate the current page title.
Obviously Wordpress does not suck, it is one of the most used blogging platforms. The feeling I got when tweaking it to do something different from the standard themes was that I was using a chainsaw to slice a loaf of bread. It was certainly powerful enough and it could certainly get the job done, but it wasn't easy and it wasn't elegant.
I've been investigating something similar for a feature I want to launch. I'm currently leaning towards running users' code in Kubernetes using Firecracker or gVisor.
My main takeaway has been that while there are good solutions for isolating users' code, there's going to be a lot of worked involved in orchestrating it at scale. I.e. building and storing images, spinning up containers, managing storage, tracking/billing minutes and bandwidth, killing timed-out containers, etc. I have not found a good library for that. It seems like a good use-case for a Kubernetes operator, so I think that's what I'll wind up building.
[1] https://fly.io/blog/sandboxing-and-workload-isolation/