As convenient and powerful as AWS API Gateway is, it’s not without its quirks. Here are a few lessons I’ve learned the hard way that can help you avoid some common pitfalls when working with AWS API Gateway.
Continue reading “AWS API Gateway Gotchas & Lessons Learned”Yes, Java ThreadLocalRandom is Safe to Use with Virtual Threads
Because Java 21 virtual threads are very cheap — per JEP Cafe, they are about 1,000 times faster to launch than a platform thread, and use about 1,000 times less memory than a platform thread — they should never be pooled. As a result, ThreadLocal
variables are unlikely to be useful in applications that use virtual threads for concurrent processing. If each task lives in its own dedicated thread, then each call to ThreadLocal
ends up returning a new value, and it ends up being a factory instead of a pool! So using ThreadLocal
in virtual threads is an anti-pattern. Developers should use another technique for pooling objects, such as structured concurrency, instead.
But what about ThreadLocalRandom
? Is this dedicated class for providing sources of randomness to threads safe to use with virtual threads?
The short answer is: Yes, ThreadLocalRandom
is safe to use with virtual threads. ThreadLocalRandom
is tightly integrated with the Thread
class to ensure that it remains efficient, even for virtual threads. For more information, keep reading.
Sample AWS Kinesis Firehose CloudWatch Log HTTP Endpoint Payload
I couldn’t find an example payload for CloudWatch Logs data delivered by a Kinesis Firehose stream to a Lambda function URL, so I set one up.
Sample payloads appear below, as well as a walkthrough of the process I used to create the data stream.
Continue reading “Sample AWS Kinesis Firehose CloudWatch Log HTTP Endpoint Payload”A Developer Workflow for Modern AWS Serverless Applications
Modern serverless applications on AWS are complex with a lot of moving parts. Mapping a developer workflow onto those applications can be difficult. This article discusses the developer workflow I have developed for complex serverless applications at aleph0, with example CloudFormation template and GitHub Action snippetes to illustrate the concepts.
The Lambda Iceberg: A Deep Dive on AWS Lambda for Java
AWS Lambda is Amazon’s FaaS product. Pound for pound, it’s one of the best serverless computing products on the market. Easy to use, inexpensive to run (among FaaS offerings), and with compelling features like Layers, Extensions, and SnapStart, Lambda is a rock-solid choice for building serverless architectures.
However, its managed nature cuts both ways. The same FaaS features that make it so easy to use for vanilla workloads — just upload your program and go — also make it hard to use for anything that requires even a little customization, like ML models. I’ve done some significant work building out complex lambda functions for Java lately, and while deploying these complex workloads on AWS Lambda using Java is complex, the reward — a perfectly elastic, pay-for-uptime microservice architecture — is well worth the effort. But it turns out there’s a lot of the “Lambda iceberg” below the water to understand before you can expect to get these complex serverless applications working with high performance and reliability.
In this blog series, I will unpack what I learned in my journey to deploy an OpenCV-backed ML model onto AWS Lambda with minimal cold start, and show how the process can be used to deploy ML models on other backends, like TensorFlow Lite, onto Lambda as well.
Unpacking My Default AWS Webapp Architecture
As part of optimizing the HumanGraphics product, I am investigating different cloud architectures and their tradeoffs. Documenting my current “default stack” for a new webapp with compute (like an API) seems like a good starting point. Here it is:
Experienced cloud engineers and architects should should look at this diagram and agree that it’s at least a sane approach to building webapps, although certainly there are others. However, a less experienced cloud user might not understand why this architecture is sane. It turns out that there’s a lot to unpack in even this simple architecture — feature differences, business pressures, tradeoffs, and more. Let’s get into it.
Continue reading “Unpacking My Default AWS Webapp Architecture”OpenAPI Generator Template Customization Example
The OpenAPI Generator is a wonderful bit of tech. It allow users to create an OpenAPI spec, and then generate client and server code from it in a variety of languages and platforms. I use it to generate DTOs for all my APIs, and to generate service interfaces to keep my client and server in sync. It also simplifies contract testing, if that’s your bag.
The generator is quite powerful out of the box, but it doesn’t do everything. Fortunately, it’s also extremely customizable, so if and when you find something that’s not supported out of the box, then you can make it work with minimal muss and fuss using template customization. Here’s how.
Continue reading “OpenAPI Generator Template Customization Example”