JRush episode 4th: Event streaming with Apache Pulsar

Transcript:

Let me introduce myself. I’m a Senior Developer Advocate at DataStax. Alex has already given an overview, so I won’t repeat that. Previously, I was a Developer Advocate at IBM, focusing on Java and open-source technologies, including WebSphere. I’m based in Chicago and am an active community builder, serving as a Java Champion and President/Executive Board Member of the Chicago Java Users Group. Before this, I worked as a development engineer and technical architect at various companies in the Chicago area.

Let’s move on quickly, as time is limited. This session aims to excite you about event streaming, Apache Pulsar, and how DataStax supports it. Here’s a quick agenda: First, we’ll align on what event streaming is. Even for seasoned developers, it can be confusing at first. I’ll introduce the basic terms, discuss the value of event streaming, and explain how it improves systems.

Next, I’ll introduce Apache Pulsar—what makes it unique, why it’s worth considering, and some of its developer-friendly features. I’ll also cover the DataStax Managed Cloud Platform, which simplifies working with Pulsar. If time permits, I’ll do a quick demo. If not, I’ll share resources where you can watch live demonstrations.

Let’s start with the basics: what is an event? According to Merriam-Webster, an event is “something that happens—an occurrence.” In technical terms, it’s a point in space and time, with three spatial coordinates (X, Y, Z) and a time dimension. Events are immutable—they cannot be erased once they occur. For instance, the birth of a baby or a musical performance happens at a specific time.

Event-driven kind of way of describing messaging and then there's also message-driven in which the sender and receiver have to know each other—in other words, your address has to be known. So, that's kind of like the two differences. But they are a highly decoupled way of passing data from one point to another.

Now, let's take a look. An event is not a new thing. If you kind of look at the event approach, it's basically an event happens, and then you immediately process it. The more traditional way is batch processing. Batch processing has its place in the computing world—you gather all the data that's there and, when you're ready, batch them all up and send them in one batch. That's why it's called batch processing. It has specific uses in our computing world, but, as you can see, with events, you're able to process it right away. The advantage is the real-time aspect of it.

Now let's look at the patterns again. The event-driven kind of way is essentially streaming too, which is "pub-sub." That's very much an architectural pattern. Basically, your client will send the data to the topic. Your publishing client sends it to the topic, and the broker owns the topic and delivers it to whoever subscribes to the topic. When the messages arrive at the topic, the broker delivers them accordingly to the subscribers.

There’s another way: message queuing, which is a form of asynchronous service-to-service communication. It’s a bit more like the sender sending data to some queues. Once it gets into the queue, the receiver picks up the messages from the queue. Once the messages are picked up, they’re gone from the queue.

Event streaming is a step beyond event messaging. What’s driving the change is the need for real-time data to enhance customer experiences and create a competitive advantage. Delivering results to users faster is crucial. Today, with AI and machine learning applications, building data pipelines is essential. Event streaming supports scalability—it enables systems to ingest high volumes of data during peak times and scale back dynamically. Built-in mechanisms handle backpressure to prevent system overload.

Event streaming allows systems to watch for events and act immediately without waiting. Subscribing to specific topics ensures efficiency and low latency in processing high-frequency messages. Comparing traditional batch processing (e.g., ETL processes) to modern event streaming highlights the shift. Batch processing deals with huge data volumes but takes time as it involves disk I/O operations. In contrast, event streaming processes data in memory in real time, transforming it before outputting to a sink.

Now, let’s talk about Apache Pulsar. Pulsar is an open-source software created by Yahoo and later donated to Apache in 2016. It’s designed to be cloud-native, supporting multi-tenancy and separating compute from storage. Pulsar brokers handle message delivery, and Apache BookKeeper manages message storage efficiently. This separation simplifies scalability and ensures message reliability with features like deduplication and retry mechanisms.

Pulsar also includes serverless "Pulsar Functions" for lightweight, real-time data transformation and processing. It supports offloading less active messages to cost-effective storage options like S3 buckets or Google Cloud Storage, improving sustainability and cost efficiency. Pulsar is compatible with multiple programming languages, including Java, Python, Go, and more.

Pulsar’s architecture separates compute and storage, unlike Apache Kafka. This segmentation allows efficient log management, improving scalability. Pulsar also integrates with existing systems like Kafka, JMS, and RabbitMQ through Starlight APIs, ensuring compatibility during migration. It offers features like geo-replication for disaster recovery and Pulsar IO for building efficient data pipelines.

At DataStax, we offer Astro Streaming, a managed Pulsar platform for quick deployment, proof-of-concept projects, and scalability. Open-source Pulsar and enterprise support options are also available. Pulsar has a rich ecosystem of connectors and clients, making it a versatile unifying platform for messaging, streaming, and queuing.

Summary

Find out what event streaming is and how it will influence future software development. Meet Apache Pulsar, an open-source distributed messaging and streaming platform for cloud-native environment. Browse Pulsar’s key characteristics and features that make it stand out from similar solutions.

About Mary

Mary Grygleski, Streaming Developer Advocate at DataStax

Social Media

Videos
card image
Apr 2, 2026
Java Memory Options You Need in Production

JVM memory tuning can be tricky. Teams increase -Xmx and assume the problem is solved. Then the app still hits OOM. Because maximum heap size is not the only thing that affects memory footprint. The JVM uses RAM for much more than heap: metaspace, thread stacks, JIT/code cache, direct buffers, and native allocations. That’s why your process can run out of memory while heap still looks “fine”. In this video, we break down how JVM memory actually works and how to control it with a minimal, production-safe set of flags. We cover heap sizing (-Xms, -Xmx), dynamic resizing, direct memory (-XX:MaxDirectMemorySize), and total RAM limits (-XX:MaxRAMPercentage) — especially in containerized environments like Docker and Kubernetes. We also explain GC choices such as G1, ZGC, and Shenandoah, when defaults are enough, and why GC logging (-Xlog:gc*) is mandatory before tuning. Finally, we show how to diagnose failures with heap dumps and OOM hooks. This is not about adding more flags. It’s about understanding what actually consumes memory — and making decisions you can justify in production.

Videos
card image
Mar 26, 2026
Java Developer Roadmap 2026: From Basics to Production

Most Java roadmaps teach tools. This one teaches order — the only thing that actually gets you to production. You don’t need to learn everything. You need to learn the right things, in the right sequence. In this video, we break down a practical Java developer roadmap for 2026 — from syntax and OOP to Spring, databases, testing, and deployment. Structured into 8 levels, it shows how real engineers grow from fundamentals to production-ready systems. We cover what to learn and what to ignore: core Java, collections, streams, build tools, Git, SQL and JDBC before Hibernate, the Spring ecosystem, testing with JUnit, and deployment with Docker and CI/CD. You’ll also understand why most developers get stuck — jumping into frameworks too early, skipping SQL, or treating tools as knowledge. This roadmap gives you a clear path into real-world Java development — with priorities, trade-offs, and production context.

Further watching

Videos
card image
Apr 30, 2026
Java Flight Recorder Tutorial: How to Profile Java Applications

High CPU, GC spikes, or slow startup are common production issues, but logs and metrics don’t always reveal what the JVM is actually doing. Java Flight Recorder (JFR) provides a precise, low-overhead view of JVM behavior, safe for use even in production environments. In this video, you’ll learn how to use JFR to identify real bottlenecks such as CPU hotspots, memory allocation pressure, thread contention, and I/O stalls. We walk through the full workflow, including starting recordings with JVM flags, controlling them via jcmd, running JFR inside Docker containers, and attaching to live systems using ephemeral containers. Then we analyze a real Spring Boot recording in JDK Mission Control, breaking down GC behavior, allocation patterns, thread states, and method-level hotspots. If you want to move from symptoms to root cause with more confidence, this approach will help. Full article with commands and examples: [https://bell-sw.com/blog/how-to-profile-java-applications-with-jfr-beginner-s-guide/](https://bell-sw.com/blog/how-to-profile-java-applications-with-jfr-beginner-s-guide/)

Videos
card image
Apr 22, 2026
Dynamic SQL Queries with Spring Data JPA in 6 Minutes

If your repository layer has multiple queries for different filter combinations, your data access logic is already getting harder to maintain. In this video, we implement dynamic SQL queries in Spring Data JPA using Specifications — a composable approach that helps avoid query duplication and keeps your filtering logic clean. We build a flexible filtering system with optional parameters (category, language, format, price) and show how Specification.unrestricted() skips empty filters, while Specification.allOf(...) combines them into a single query. We also address a common issue: string-based field access. It’s fragile and can break at runtime when your model changes. Using the JPA Static Metamodel, we move to compile-time safety. The result is a cleaner, more maintainable way to implement dynamic filtering in Spring-based applications.

Videos
card image
Apr 8, 2026
Best Oracle Java Alternatives in 2026 Comparison of OpenJDK Distributions

A comparison of major OpenJDK distributions (Temurin, Liberica, Zulu, Corretto, Semeru, etc.), covering who maintains them, how updates are delivered, and what lifecycle guarantees they provide. We also explain why upstream OpenJDK isn’t production-ready and how your vendor choice impacts real-world systems. Useful for Spring Boot, containers, and Kubernetes to avoid hidden risks and choose the right runtime.