+1

[Symfony4] Giải thích cơ chế hoạt động của worker

Phạm vi sử dụng

Symfony là framework gạo cội trong làng PHP, với khá nhiều project xử dụng và custom. Điển hình là ECCUBE (1 ecommerce ở JAPAN). Ở đây mình xin nói về symfony4, mình đã trải nghiệm thử worker và xin phép được mô tả với mọi người cách hoạt động của nó.

Các hoạt động đối với driver redis

try {
            $messages = $this->connection->xreadgroup(
                $this->group,
                $this->consumer,
                [$this->stream => $messageId],
                1
            );
        } catch (\RedisException $e) {
            throw new TransportException($e->getMessage(), 0, $e);
        }

Symfony4 worker dựa trên stream của redis để hoạt động.

Mình xin tóm tắt trong các ý sau:

A Redis stream is a data structure that acts like an append-only log. You can use streams to record and simultaneously syndicate events in real time. Examples of Redis stream use cases include: Event sourcing > > (e.g., tracking user actions, clicks, etc.) Sensor monitoring (e.g., readings from devices in the field)

Có thể thấy rõ qua 1 ảnh stream khá đẹp như sau:

Worker hoạt động dựa trên cơ chế push message vào stream, Producer1 ở đây gửi một đoạn message chứa data, để các worker sau đó sẽ get và xử lí

Các worker pick message thông qua cơ chế consumer group của redis. Ở đây mỗi worker là 1 consumer. Mỗi consumer (consumerA) sẽ pick 1 message từ stream để xử lí, sau khi pick message đó sẽ ở pending list (PEL), nhờ vậy message đó không thể bị pick bởi các consumer khác, sau khi xử lí xong, consumerA sẽ ACK message đó, làm message đó quay trở lại stream ở trạng thái sẵn sàng, nhưng consumerA đồng thời cũng xoá message đó khỏi stream.

Đây là cách thức hoạt động của symfomy messenger dùng redis driver. Hy vọng sẽ giúp các bạn hiểu hơn 😃 . Thanks mọi người đã đọc 😋


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí