สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์
ออกแบบสถาปัตยกรรมสำหรับผลักกระแสข้อมูลและการอัปเดตอย่างต่อเนื่องไปยังไคลเอ็นต์ที่เชื่อมต่ออยู่
สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์ เป็นบทเรียน WebSockets & Real-Time Systems with Spring ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน WebSockets & Real-Time Systems with Spring และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส WebSockets & Real-Time Systems with Spring มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
Real-Time Data Push
Modern applications thrive on instant updates. Imagine a stock ticker, a sports score app, or a chat room – all need data delivered as it happens, not on request.
This lesson explores how to design server-side architectures that actively push continuous data streams and updates to connected clients.
Publisher-Subscriber Model
At the core of data push is the Publisher-Subscriber (Pub/Sub) pattern. Here's how it works:
- Publishers: These are server-side components that generate and send messages.
- Subscribers: These are connected clients (e.g., web browsers, mobile apps) that express interest in specific types of messages.
The system delivers messages from publishers to all interested subscribers, decoupling the data source from its consumers.
Server-Side Data Sources
Where does the data you want to push originate? Common sources include:
- Database Changes: Real-time updates when data in your database is modified.
- External APIs: Events or data received from third-party services.
- Internal Application Events: Actions within your own application (e.g., a new order placed, a user status change).
- Message Queues: Data consumed from systems like Kafka or RabbitMQ.
Your push architecture acts as a bridge, taking data from these sources and sending it to clients.
Spring Push Service Example
Let's see a simple Spring Boot service that simulates generating and pushing data to a STOMP topic. We use SimpMessagingTemplate, Spring's helper for sending messages to broker destinations.
Try running this example:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
// Main Spring Boot Application
@SpringBootApplication
@EnableScheduling // Enables scheduled tasks like our data push
@EnableWebSocketMessageBroker // Enables STOMP over WebSockets
public class RealTimeApp {
public static void main(String[] args) {
SpringApplication.run(RealTimeApp.class, args);
}
}
// WebSocket Configuration for STOMP
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Enable a simple in-memory broker for '/topic' and '/user' destinations
config.enableSimpleBroker("/topic", "/user");
// Prefix for messages from clients to server-side @MessageMapping methods
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// Register the '/ws' endpoint for WebSocket handshake
registry.addEndpoint("/ws").withSockJS();
}
}
// Service to push real-time data
@Service
class DataPushService {
private final SimpMessagingTemplate messagingTemplate;
private int counter = 0;
public DataPushService(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
// This method runs every 3 seconds and pushes data
@Scheduled(fixedRate = 3000)
public void pushTimeUpdate() {
String message = "Current time: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " (Update " + (++counter) + ")";
// Push to a public topic. Clients can subscribe to '/topic/updates'.
messagingTemplate.convertAndSend("/topic/updates", message);
System.out.println("Pushed to /topic/updates: " + message);
}
}Broadcasting Updates
The example in the previous scene demonstrates broadcasting. When our DataPushService sends a message to /topic/updates, it's pushed to all clients currently subscribed to that topic.
- This is ideal for public data streams like chat rooms, news feeds, or global notifications.
- It's an efficient fan-out architecture, where a single message from the server reaches multiple clients simultaneously.
Targeted Push: Topics & Users
While topics are great for broadcasting, sometimes you need to send messages to a specific user or a small group. STOMP supports two main types of destinations for pushing data:
- Topics (e.g.,
/topic/news): For broadcasting messages to all subscribers. - User Destinations (e.g.,
/user/{userId}/queue/notifications): For sending private, user-specific messages.
Understanding this distinction is crucial for designing flexible push architectures.
Private User Notifications
To send a private message or notification to a specific user, Spring's SimpMessagingTemplate provides the convertAndSendToUser() method.
This method automatically routes the message to the correct WebSocket session(s) associated with that user ID.
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
@Service
public class NotificationService {
private final SimpMessagingTemplate messagingTemplate;
public NotificationService(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
public void sendPrivateNotification(String userId, String message) {
// The client would subscribe to '/user/queue/notifications'
// Spring handles the '/user/{userId}' part automatically.
messagingTemplate.convertAndSendToUser(userId, "/queue/notifications", message);
System.out.println("Sent private notification to " + userId + ": " + message);
}
}External Event Integration
For complex, high-volume, or distributed systems, your data sources might be external message brokers like Apache Kafka or RabbitMQ.
Your push architecture would involve:
- A Spring component acting as a consumer, listening to messages from the external broker.
- Upon receiving a message, this component then uses
SimpMessagingTemplateto push the data via WebSockets to relevant clients.
This pattern ensures loose coupling and scalability.
Scaling Push Architectures
As your application grows, you'll need to scale your data push system:
- Horizontal Scaling: Run multiple instances of your WebSocket server.
- External Message Brokers: Essential for inter-server communication when horizontally scaled. They ensure messages reach all relevant clients, regardless of which server instance they're connected to.
- Load Balancers: Distribute client connections across your server instances. Sticky sessions might be needed for simple setups, or more advanced session management for complex ones.
Architecture Quiz
You're building a real-time application. Users need to receive updates about their own specific orders, while also seeing a public feed of recently placed orders by everyone. Which architectural approach is best for each scenario?
Recap: Data Push Mastery
You've now explored the essential concepts behind real-time data push architectures:
- The Publisher-Subscriber model as a foundation.
- Identifying various server-side data sources.
- Implementing broadcasting via topics and private notifications via user destinations in Spring.
- Understanding the role of external event sources and strategies for scaling your push system.
This knowledge empowers you to design robust and efficient real-time data delivery for any application!
คำถามที่พบบ่อย
บทเรียน “สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส WebSockets & Real-Time Systems with Spring ให้อัปเกรดเป็น CoddyKit PRO คอร์ส WebSockets & Real-Time Systems with Spring มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์”
ออกแบบสถาปัตยกรรมสำหรับผลักกระแสข้อมูลและการอัปเดตอย่างต่อเนื่องไปยังไคลเอ็นต์ที่เชื่อมต่ออยู่ คุณปฏิบัติ WebSockets & Real-Time Systems with Spring ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน WebSockets & Real-Time Systems with Spring หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน WebSockets & Real-Time Systems with Spring บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน WebSockets & Real-Time Systems with Spring นี้ได้ไหม
ได้ บทเรียน WebSockets & Real-Time Systems with Spring ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ (SSE) เทียบกับ WebSockets
- สถาปัตยกรรมการผลักข้อมูลแบบเรียลไทม์
- การนำการแจ้งเตือนผู้ใช้ไปใช้
- การติดตามสถานะการมีอยู่และสถานะออนไลน์