العمليات عديمة الحالة في مقابل العمليات ذات الحالة
افهم كيفية تعامل Kafka Streams مع معالجة البيانات مع الحفاظ على الحالة الداخلية للسجلات أو من دون ذلك
العمليات عديمة الحالة في مقابل العمليات ذات الحالة درس مجاني في Apache Kafka & Stream Processing Fundamentals على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Apache Kafka & Stream Processing Fundamentals، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Apache Kafka & Stream Processing Fundamentals 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Stateless vs. Stateful Streams
In Kafka Streams, how you process data falls into two main categories: stateless and stateful operations.
Understanding this distinction is crucial for building efficient and correct real-time data pipelines. It impacts how your application remembers (or forgets) past events.
What are Stateless Operations?
Stateless operations process each incoming record independently. They don't remember any past records or maintain an internal state across events.
Think of it like a simple function: you give it an input, and it produces an output, without needing any memory of previous inputs.
Stateless Example: Map & Filter
Common stateless operations include map, filter, flatMap, and peek. They transform or filter records one by one.
Here's a simple Kafka Streams app using mapValues to convert all incoming message values to uppercase:
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.Topology;
import org.apache.kafka.streams.kstream.KStream;
import java.util.Properties;
public class StatelessMapApp {
public static void main(String[] args) {
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG,
"stateless-map-app");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,
"localhost:9092");
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_BY_KEY_CLASS_CONFIG,
Serdes.String().getClass());
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_BY_KEY_CLASS_CONFIG,
Serdes.String().getClass());
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source = builder.stream("input-topic");
// Stateless operation: mapValues
KStream<String, String> upperCaseStream =
source.mapValues(value -> value.toUpperCase());
upperCaseStream.to("output-topic");
Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, props);
streams.start();
// In a real app, add a shutdown hook.
}
}When to Use Stateless Operations
Stateless operations are ideal for:
- Simple Transformations: Changing data format, type conversion.
- Filtering: Removing unwanted records.
- Data Cleansing: Basic sanitization of individual records.
They are generally simpler to implement and have less overhead because no state needs to be managed.
What are Stateful Operations?
Stateful operations are those that need to remember past records or combine information across multiple records to produce a result.
They maintain an internal state, which is stored locally within the Kafka Streams application instance. This state allows them to perform aggregations, joins, and windowing.
Stateful Example: Counting Events
A classic example of a stateful operation is count(). To count events per key, the application must remember previous counts for each key.
This operation transforms a KStream into a KTable, which represents a changelog of aggregated results.
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.Topology;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KTable;
import org.apache.kafka.streams.kstream.Materialized;
import java.util.Properties;
public class StatefulCountApp {
public static void main(String[] args) {
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG,
"stateful-count-app");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,
"localhost:9092");
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_BY_KEY_CLASS_CONFIG,
Serdes.String().getClass());
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_BY_KEY_CLASS_CONFIG,
Serdes.String().getClass());
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source = builder.stream("input-topic");
// Stateful operation: count by key
KTable<String, Long> countsTable = source
.groupByKey()
.count(Materialized.as("counts-store")); // A named state store
countsTable.toStream().to("output-topic");
Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, props);
streams.start();
// In a real app, add a shutdown hook.
}
}More Stateful Operations
Besides count(), other common stateful operations include:
- Aggregations:
reduce(),aggregate()(e.g., calculating sums, averages). - Joins: Combining data from two streams or a stream and a table based on a common key.
- Windowing: Grouping records that fall within a defined time frame (e.g., 5-minute window).
These operations all rely on maintaining state to function correctly.
Kafka Streams State Stores
Kafka Streams manages state using internal state stores. These are typically backed by a local key-value store like RocksDB.
For fault tolerance, Kafka Streams also uses internal Kafka topics (called changelog topics) to continuously back up the state store. If an application instance fails, its state can be restored from the changelog topic by a new instance.
Quick Check: Identify Operations
Which of these Kafka Streams operations is considered stateless?
Recap: Stateless vs. Stateful
We've explored the key differences between stateless and stateful operations in Kafka Streams:
- Stateless: Processes records individually, no memory of past events. Ideal for simple transformations and filtering.
- Stateful: Requires internal memory (state stores) to combine or remember information across records. Essential for aggregations, joins, and windowing.
Choosing the right type of operation is fundamental to designing robust and efficient stream processing applications.
الأسئلة الشائعة
هل درس «العمليات عديمة الحالة في مقابل العمليات ذات الحالة» مجاني؟
نعم — نص درس «العمليات عديمة الحالة في مقابل العمليات ذات الحالة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Apache Kafka & Stream Processing Fundamentals، انتقل إلى CoddyKit PRO. تتضمن دورة Apache Kafka & Stream Processing Fundamentals 4 دروس في المجموع.
ماذا ستتعلم في «العمليات عديمة الحالة في مقابل العمليات ذات الحالة»؟
افهم كيفية تعامل Kafka Streams مع معالجة البيانات مع الحفاظ على الحالة الداخلية للسجلات أو من دون ذلك تتمرن على Apache Kafka & Stream Processing Fundamentals مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Apache Kafka & Stream Processing Fundamentals؟
لا تُشترط خبرة سابقة. Apache Kafka & Stream Processing Fundamentals على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «العمليات عديمة الحالة في مقابل العمليات ذات الحالة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Apache Kafka & Stream Processing Fundamentals هذا؟
نعم. كل درس في Apache Kafka & Stream Processing Fundamentals يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بناء تطبيق Kafka Streams بسيط
- مفاهيم KStream وKTable
- العمليات عديمة الحالة في مقابل العمليات ذات الحالة
- Serdes وتسلسل البيانات في Kafka Streams