Chủ Nhật, 10 tháng 3, 2019

Những câu hỏi

  • Quy tắc reserve job của beanstakd là thế nào?. Tại sao 1 job lại được ưu tiên hơn job khác?
  • Khi put 1 job xuống beanstalkd thì chuyện gì sẽ xảy ra?

Beanstalkd: Những khái niệm cơ bản

connect 1
watch
use
watch
use
watch
use
watch
use
Client1
Beanstalk Server
tube1
tube 2
...
tube n
job 1
job 2
job 4
job 3

Working with tube

Beanstalkd cho phép tạo nhiều loại task queue khác nhau. Chúng được gọi là Tube.

# Beanstalkd source code: file dat.h
struct Conn {
 ...
    tube   use;
   
    struct ms  watch;  
};

Conn *make_conn(int fd, char start_state, tube use, tube watch);

Khi tạo kết nối tới Beanstalkd cần quan tâm tới 2 khái niệm:

  • use: Chuyên dùng đề put job tới, 1 connection thường chỉ đi với 1 tube tại 1 thời điểm.
  • watch: Sử dụng khi reserve job. 1 Connection có thể watch nhiều tubes cùng 1 lúc

Working with Job

Beanstalkd là 1 hệ thống task queue hoạt động rất hiệu quả và stable. Vì là 1 task queue nên nó sẽ có những đặc điểm riêng biệt so với các hệ thống queue khác như:

  1. Job có priority
  2. Job này có để dependent 1 job khác để có thể xử lý tuần tự
  3. Job được xử lý theo nguyên tắc FIFO

Khi put 1 job xuống beanstalkd thì chuyện gì sẽ xảy ra?

Khi put 1 job xuống dưới 1 tube. Hệ thống sẽ tự động sắp xếp lại tube đó theo nguyên tắc:

  • FIFO: Job nào được đưa vào trước thì sẽ đứng ở đầu tube
  • Priority: Job nào có độ priority cao hơn thì sẽ được đưa lên trên

Quy tắc reserve job của beanstakd là thế nào?. Tại sao 1 job lại được ưu tiên hơn job khác?

watch
watch
watch
watch
Client 1
tube1
tube 2
Client 2
...
tube n
job 1
job 2
job 4
job 3

Action reserve chỉ lấy những job nằm trong danh sách watch của connection để tính toán và chọn ra job có độ ưu tiên cao nhất để lấy ra xử lý trước tiên. Nếu tất cả các job có cùng 1 độ ưu tiên thì xử lý theo nguyên tắc FIFO, job nào đươc đưa vào đầu tiên sẽ được lấy ra xử lý.

Thế nào là job có độ ưu tiên cao hơn

  • FIFO: Job nào được đưa vào trước thì xử lý trước
  • Priority: Job nào có độ priority cao hơn thì sẽ được xử lý trước tiên
  • Khi job có độ priority giống nhau thì job nào được đưa vào trước sẽ xử lý trước
  • Chỉ xử lý những job nằm trong danh sách tubes mà connection watch

*Lưu ý: Inspect code bên dưới ta sẽ thấy nếu 1 worker làm việc cùng 1 lúc với nhiều tube khác nhau, và các job trong các tube có độ ưu tiên bằng nhau, thì Beanstalkd sẽ lấy tuần tự từng tube 1. Khi nào hết job của tube này thì mới tới job của tube kia.

  # file prot.c
static job next_eligible_job(int64 now)
{
	tube t;
	size_t i;
	job j =  NULL, candidate;

   # Chạy tuần tự từng tube để lấy ra job cần xử lý
	for (i =  0; i < tubes.used; i++) {
		t = tubes.items[i];
		if (t->pause) { #không watch nhưng tube đang ở trạng thái pause
			if (t->deadline_at  > now) continue;
				t->pause  =  0;
		}

		if (t->waiting.used  && t->ready.len) {
			candidate = t->ready.data[0];
			# lấy job ở top của các tubes, và so sánh priority của chúng với nhau
			if (!j ||  job_pri_less(candidate, j)) {
				j = candidate;
			}
		}
	}
	return j;
}


Reactions: