Hellscream
Đã tốn tiền
Chuyện cá nhân my friend ạ. Đỉnh cao là lũ ml ấy lừa tôi đưa CV cho chúng nó.Vậy hả bácbác có thể chia sẻ thêm về cái này đc k
Gửi từ Xiaomi 2201117SG bằng vozFApp
via theNEXTvoz for iPhone
Chuyện cá nhân my friend ạ. Đỉnh cao là lũ ml ấy lừa tôi đưa CV cho chúng nó.Vậy hả bácbác có thể chia sẻ thêm về cái này đc k
Gửi từ Xiaomi 2201117SG bằng vozFApp
Bác có tiện kể đây ko, hay để e hộp bác nhéChuyện cá nhân my friend ạ. Đỉnh cao là lũ ml ấy lừa tôi đưa CV cho chúng nó.
via theNEXTvoz for iPhone
RingBuffer poll rồi chứa data trong memory. Vậy nếu server crash thì bạn recover data như thế nào?
Dùng 1 thread khác pull dữ liệu rồi để vào queue. Nếu crash thì pull lại từ queue.RingBuffer poll rồi chứa data trong memory. Vậy nếu server crash thì bạn recover data như thế nào?
Mình nghĩ ra mấy hướng sau:
1. Resend data từ message queue + implement idempotency
2. Replicate RingBuffer qua 1 node khác + realtime replication
3. Persist data asynchronously vào 1 database khác, khi processing với RingBuffer rồi track các leaf sequence khi đang process, tạo lại RingBuffer state khi restart + implement idempotency
Thanks bạn.Dùng 1 thread khác pull dữ liệu rồi để vào queue. Nếu crash thì pull lại từ queue.
có cách khác đây:Thanks bạn.
1. Vậy nếu server không crash thì lúc nào mình clear cái queue này?
2. Sau khi pull lại, mình trực tiếp consume message hay dùng message này để build lại RingBuffer?
a. Nếu consume trực tiếp thì chắc ok, (fail nữa thì cũng chỉ mất 1 message là cùng).
b. Nếu build lại RingBuffer mà server fail tiếp thì làm thế nào? (Cách này có vẻ hơi phức tạp)
Hi bác, em cũng mới vọc vạch đọc thử thằng Lmax Disruptor, đọc cái comment của bác thì vẫn có 1 thắc mắc như thế này.Như vậy thì Lmax Disruptor giúp triển khai được 1 pipeline có 3 thread riêng biệt Validate Order, Matching Engine
Bạn đang dùng nó à, k em lâu r k dùng nhưng mà mình chưa hiểu ý frenHi bác, em cũng mới vọc vạch đọc thử thằng Lmax Disruptor, đọc cái comment của bác thì vẫn có 1 thắc mắc như thế này.
Bản thân cái thằng ring buffer nó sẽ lưu data của cùng 1 kiểu, như bác bảo là Validate sau chuyển cho Matching, từ Matching chuyển cho Other Business Logic, thì em đang muốn hỏi thêm bác là: việc "chuyển" ở đây ý bác là như thế nào, em chỉ mới có 2 ý hiểu, nhưng không cái nào giải thích được cái bác nói là 3 thread song song cả.
Mong bác khai sáng thêm.
- Thằng Validate gọi Matching, Matching gọi Other Business Logic, nhưng như thế này thì đâu gọi là 3 thằng này chạy song song được
- Thằng Validate làm xong nó lưu kết quả vào 1 cái shared data, thằng Matching khi xử lí đến cái data đã được xử lí bởi Validate thì vào check shared data, cái này thì tuỳ logic, có thể là validate pass thfi mới có trong shared data, hoặc vốn trong shared data nó sẽ có 1 field để mark là pass hay fail validation, tương tự với trường hơp other business logic. Nhưng nếu như vậy thì sẽ vẫn block ở shared data.
Updated: Em vừa nghĩ đến 1 khả năng khác là chính cái data lưu trong ring buffer nó đã là 1 cái shared data rồi, mỗi 1 consumer sẽ update vào những field tương ứng của nó. :/ Tuy nhiên em cũng k rõ cái này có phải best practice không.
Data trong ringbuffer thường sẽ là immutable. Muốn truyền từ bước này sang bước khác thì dùng một ringbuffer khác.Hi bác, em cũng mới vọc vạch đọc thử thằng Lmax Disruptor, đọc cái comment của bác thì vẫn có 1 thắc mắc như thế này.
Bản thân cái thằng ring buffer nó sẽ lưu data của cùng 1 kiểu, như bác bảo là Validate sau chuyển cho Matching, từ Matching chuyển cho Other Business Logic, thì em đang muốn hỏi thêm bác là: việc "chuyển" ở đây ý bác là như thế nào, em chỉ mới có 2 ý hiểu, nhưng không cái nào giải thích được cái bác nói là 3 thread song song cả.
Mong bác khai sáng thêm.
- Thằng Validate gọi Matching, Matching gọi Other Business Logic, nhưng như thế này thì đâu gọi là 3 thằng này chạy song song được
- Thằng Validate làm xong nó lưu kết quả vào 1 cái shared data, thằng Matching khi xử lí đến cái data đã được xử lí bởi Validate thì vào check shared data, cái này thì tuỳ logic, có thể là validate pass thfi mới có trong shared data, hoặc vốn trong shared data nó sẽ có 1 field để mark là pass hay fail validation, tương tự với trường hơp other business logic. Nhưng nếu như vậy thì sẽ vẫn block ở shared data.
Updated: Em vừa nghĩ đến 1 khả năng khác là chính cái data lưu trong ring buffer nó đã là 1 cái shared data rồi, mỗi 1 consumer sẽ update vào những field tương ứng của nó. :/ Tuy nhiên em cũng k rõ cái này có phải best practice không.
Còn kiểu các thread check cái biến atomic đó như nào.Data trong ringbuffer thường sẽ là immutable. Muốn truyền từ bước này sang bước khác thì dùng một ringbuffer khác.
Còn nếu muốn làm kiểu update tại chỗ message trong ringbuffer thì sau mỗi bước complete sẽ tăng một atomic variable để báo cho thread khác vị trí đã xử lý done.
Ví dụ có 2 bước validate input và business logic.
Sau khi thành validate input xử lý được 20 message thì sẽ tăng biến atomic lên 20, thằng business logic sẽ có thể read biến đó ra và chỉ xử lý thêm 20 message đó, xử lý xong lại quay lại check biến atomic.
Trong quá trình business logic đang chạy thì thằng validate có thể xử lý tiếp thêm 30 message nữa.
Kiểu vừa song song lại vừa tuần tự
Em đang muốn làm rõ thêm về cái flow mà bác martin98 đề cập đối với việc áp dụng lmax trong cái exchange-core.Bạn đang dùng nó à, k em lâu r k dùng nhưng mà mình chưa hiểu ý fren
Nếu như bác đề cập thì mình tạo ra 2 cái ring buffer riêng biệt cho validate input và business logic, vì những cái bác đề cập em thấy nó chính là nguyên lí của thằng Disruptor rồi. Còn nếu vẫn muốn chỉ giữ 1 cái ring buffer mà cả 2 thằng validate input và business logic nó đều chạy trên đó thì sẽ hơi nhập nhằng vì mình phải thêm check coi là cái event hiện tại đang consume là được thêm bởi thằng nào.Data trong ringbuffer thường sẽ là immutable. Muốn truyền từ bước này sang bước khác thì dùng một ringbuffer khác.
Còn nếu muốn làm kiểu update tại chỗ message trong ringbuffer thì sau mỗi bước complete sẽ tăng một atomic variable để báo cho thread khác vị trí đã xử lý done.
Ví dụ có 2 bước validate input và business logic.
Sau khi thành validate input xử lý được 20 message thì sẽ tăng biến atomic lên 20, thằng business logic sẽ có thể read biến đó ra và chỉ xử lý thêm 20 message đó, xử lý xong lại quay lại check biến atomic.
Trong quá trình business logic đang chạy thì thằng validate có thể xử lý tiếp thêm 30 message nữa.
Kiểu vừa song song lại vừa tuần tự
Nếu như bác đề cập thì mình tạo ra 2 cái ring buffer riêng biệt cho validate input và business logic, vì những cái bác đề cập em thấy nó chính là nguyên lí của thằng Disruptor rồi. Còn nếu vẫn muốn chỉ giữ 1 cái ring buffer mà cả 2 thằng validate input và business logic nó đều chạy trên đó thì sẽ hơi nhập nhằng vì mình phải thêm check coi là cái event hiện tại đang consume là được thêm bởi thằng nào.
Nhưng nếu tạo ra 2 cái ring buffer riêng biệt thì em khá là cấn việc tại sao mình lại cần cái ring buffer thay vì việc 1 function gọi thẳng tuần tự validate -> business logic
Cái ý thứ 2 là lý do chạy 2 thread trên cùng một ring buffer đó.Nếu như bác đề cập thì mình tạo ra 2 cái ring buffer riêng biệt cho validate input và business logic, vì những cái bác đề cập em thấy nó chính là nguyên lí của thằng Disruptor rồi. Còn nếu vẫn muốn chỉ giữ 1 cái ring buffer mà cả 2 thằng validate input và business logic nó đều chạy trên đó thì sẽ hơi nhập nhằng vì mình phải thêm check coi là cái event hiện tại đang consume là được thêm bởi thằng nào.
Nhưng nếu tạo ra 2 cái ring buffer riêng biệt thì em khá là cấn việc tại sao mình lại cần cái ring buffer thay vì việc 1 function gọi thẳng tuần tự validate -> business logic
Còn làm sao để tránh chạy song song cùng 1 message là dùng biến atomic cho cái sequence number đó.Cái ý thứ 2 là lý do chạy 2 thread trên cùng một ring buffer đó.
2 cái đó vẫn chạy song song.
Nhưng cái thứ hai luôn đi sau cái thứ nhất 1 bước.
Trong khi cái thứ 2 đang xử lý cái thứ nhất vẫn chạy xử lý message mới bt.
Vừa có song song vừa có một phần tuần tự là thế.
Tuần tự là một msg thì bước 1 xử lý mới được đến bước 2.
Còn song song thì 2 msg khác nhau có thể vừa xử lý bước 1 cho msg này, bước 2 có msg khác.
Call function thì chỉ có tuần tự thôi