Giải quyết vấn đề concurrency trong lập trình?

Đầu tiên chủ đề của mình thuộc dạng tổng quát, không phụ thuộc lập trình ngôn ngữ nào (Java, Swift, C++,…), hay lập trình trên nền tảng nào cả (Front-end, Mobile).

Theo mình biết, concurrency hiện tại đang là một trong yếu tố quan trọng trong các ứng dụng đòi hỏi app có tính real-time và response, dịch nôm na là làm sao app chạy mượt, phản hồi tốt trước các thao tác của end-user khi các thao tác đòi hỏi những câu lệnh có tốc độ thực thi chậm như: truy vấn database, truy vấn thông qua webservice, tính toán hình ảnh bitmap,…

Vậy với một app bất kì, có thể là mobile app, web app hay desktop app, được thiết kế theo non-concurrency thì làm thế nào có thể áp dụng concurrency vào app đó mà không ảnh hướng đến thiết kế ban đầu của app? Và có các Design Pattern nào giải quyết tốt cho trường hợp concurrency này không?

Mong các bạn thảo luận nhiệt tình. Theo mình nghĩ đây cũng là vấn đề nhiều bạn quan tâm khi các app hiện tại đều thuộc dạng real-time, như social network, chat, video streaming,…

3 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Vấn đề này mình có 2 ý tưởng để áp dụng xử lý song song vào kiến trúc đơn luồng hiện có.

  1. Module hóa luồng chạy.

Khi hệ thống được phân chia từng module rõ ràng, thì chúng ta có thể áp dụng xử lý song song vào từng module nhỏ (nếu có thể) mà không ảnh hưởng đến toàn bộ luồng chạy. Lấy ví dụ bài toán tìm kiếm điểm tổng kết của tất cả học sinh tên Nguyễn Văn A trong khối 10 của tỉnh X.
Module A xử lý phần nhập tên, module B được chia thành 20 phần, mỗi phần tìm kiếm tên của học sinh trong 1 trường thuộc tỉnh X. Module C trả về các kết quả tìm thấy.

  1. Thiết kế stateless thay vì stateful

Ưu điểm của thiết kế stateless là không bị phụ thuộc vào trạng thái trước đó. Giúp một module có thể phục vụ nhiều process mà không ảnh hưởng để kết quả.

5 Likes

Cho em hỏi trong thực tế hệ thống stateful là hệ thống nào vậy anh? Em chỉ thấy hệ thống xây dựng theo kiến trúc webservice, client server giao tiếp với nhau bằng API qua giao thức http, mà http là stateless nên cần token để request sau phụ thuộc vào request trước. Theo em thì hệ thống stateful là kết nối database, FTP, … phía backend mới cần quan tâm tới kết nối stateful còn đối với frontend thì stateful không quan trọng lắm nhỉ?

Cậu đúng đó, database (bao gồm cả distributed cache), hay hệ thống phải maintain connection giữa 2 máy xác định (web socket trong ứng dụng chat chẳng hạn), hay service discovery… là 1 và ví dụ về hệ thống stateful :smile:
Không hẳn chỉ backend mới cần quan tâm vấn đề này đâu cậu (dù cần phải quan tâm hơn). Nếu cậu phải làm việc với các load balancer, đôi lúc cậu cũng phải cân nhắc stateful load balancer (flexible hơn với các chiến lược cân bằng tải khác round robin), hay cài đặt session (tất nhiên cậu có thể sử dụng DB hay backend service để làm việc này).
HTTP không liên quan tới việc 1 hệ thống là stateless hay stateful đâu cậu. Nếu server của cậu lưu trữ/thay đổi trạng thái sau 1 HTTP request, đó là stateful rồi :smile:

Hope it helps!

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?