THẢO LUẬN

Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 12, 2018 11:33 SA

@vhung Theo kinh nghiệm của mình mình thì đánh lại index khi có một user thay đổi (create hay update) diễn ra nhanh mà nhỉ. Nếu vì một lý do nào đó việc tạo hoặc update index cho 1 user mất thời gian quá (cỡ 500ms đổ lên chẳng hạn) thì bạn có thể dùng delayed job. Tức là sau khi user được tạo hoặc update thì bạn tạo ra một delayed job A (có nội dung là update lại index trên elasticsearch) rồi response thành công cho user luôn.

Sau đó các worker sẽ tự tìm delayed job A để chạy. Nếu lượng worker đủ lớn để handle hết các job thì việc delay cũng sẽ không quá đáng kể 😄 (Sau khi user tạo tài khoản xong trong lúc gõ từ khoá để search thì job A đã chạy xong rồi chẳng hạn 😃)

+1
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 12, 2018 9:34 SA

@bs90 Cách này mình có nghĩ đến nhưng cứ mỗi lần tạo hay update user mà update lại index thì phải call API để update index của ES, như thế thì người dùng phải đợi cho đến khi index ES được cập nhật lại thì tiến trình create hay update user mới thành công cũng không hay lắm.

0
thg 8 12, 2018 4:26 SA

không ghi nguồn vậy bạn?

0
thg 8 12, 2018 3:45 SA

chính xác thì gem gì ấy nhỉ.

0
Avatar
đã bình luận cho bài viết
thg 8 11, 2018 3:02 CH

Nice post

0
thg 8 11, 2018 9:01 SA

sao viết có nhiêu đây vậy ạ,. Anh ko viết tiếp à

0
Avatar
đã bình luận cho bài viết
thg 8 11, 2018 2:35 SA

Ok thanks bạn, để mình thử xem sao

0
thg 8 10, 2018 11:13 CH

@MinhDuc Có giải pháp thì ta cứ thử thôi 😄 Đáp ứng được yêu cầu là OK. Mình cũng không nắm được gì về yêu cầu của cái bạn đang làm.

Còn về vụ

jobs A chạy tốn 5s thì jobs B sẽ bị call trễ 5 giây

thì đơn giản mình assign job B vào đầu tiến trình chạy job A là xong mà 😄

P.S. Mình chỉ đóng góp ý tưởng thôi, còn không biết gì về PHP và Laravel nhé 😄

0
Avatar
đã bình luận cho bài viết
thg 8 10, 2018 6:03 CH

Bạn liên hệ anh @thangtd90 để được hỗ trợ chức năng mới này nhé (yaoming)

0
Avatar
đã bình luận cho bài viết
thg 8 10, 2018 6:02 CH

Không hề luôn, mình dùng Ubuntu, cả lập trình và chat facebook luôn, không bị sao hết, bạn thử gỡ hẳn ra, cài lại xem sao https://www.sitecuatui.com/ibus-unikey-go-tieng-viet-ubuntu/

Còn về phên bản thì bản 16.04 có vẻ ổn định và chạy mượt hơn 18.04

0
thg 8 10, 2018 4:57 CH

Mình chưa đủ reputation để upvote ^^. Nice post, thanks bạn nhiều.

0

Cảm ơn bạn đã chia sẻ.

0
Avatar
đã bình luận cho bài viết
thg 8 10, 2018 4:03 CH

không có thả ❤️ nhỉ 😃))

+1

dạ vâng em đã dẫn nguồn rồi ạ ! Em sơ xuất quá ạ !

0
thg 8 10, 2018 3:38 CH

1.Qua gợi ý của bạn. Mình nghĩ ko nên dùng queues vì sợ mất data , time out các kiểu . 2. Cách trên bị hạng chế do độ trễ của mỗi jobs => jobs A chạy tốn 5s thì jobs B sẽ bị call trễ 5 giây Mình nghĩ ra giải pháp sau bạn góp ý vs nha

  1. cron job chạy 1 phút 1 lần query lấy process nào active = true;
  2. Nếu nó đang được kích hoạt thì mình cho nó vào vòng lặp while với điều kiện bên dưới
  public function shedule(){
    $total = $process->total;
    $result = array(
        'completed ' => 0
        'success' => 0,
        'error' => 0,
    );
    while ( ){ 
      if( Redis::get('active'.$process_id) == flase || $result['completed '] > $total ){
         break;
         $this->jobCompletedCallback($result);         
      }
      try{
          $this->doMyJobs();
          $result['success']++;
       }catch(Exception $e){
          $result['error']++;
       }
       $result['completed ']++;
       $this->saveResult($result);
       sleep(16);         
    }
  }
  public function doMyJobs(){
      // nhiệm vụ con
  }
  public function saveResult($result){
      // lưu tạm kết quả lên redis
  }  
  public function jobCompletedCallback($result){
      // nhiệm vụ xong lưu kết quả vào database và xóa mọi thứ trên redis
  }   
0
thg 8 10, 2018 2:30 CH

thanks bro, t có đổi cách viết, mong thím thích kiểu mới này =))

0
thg 8 10, 2018 2:29 CH

rất cảm ơn sự ủng hộ của anh, thú thực là tôi đã sai khi cố dặn ra thật nhiều chữ cho đạt yêu cầu, đã cải tạo lại cho bớt lan man =))

0
thg 8 10, 2018 1:47 CH

Ngoài ra thay vì tạo một lúc 5000 rows, nếu có thể bạn có thể chỉ set các job con cho phút đầu tiên, sau mỗi mỗi job con sẽ có callback để init job con kế tiếp gối nhau như thế. Tuy nhiên làm thế này sẽ phải handle error tốt nếu không muốn đang chạy thì đứt gánh 😃

0
thg 8 10, 2018 1:37 CH

Bài này của anh Trần Trọng Thanh bên Nâu Studio. Mình nghĩ bạn nên ghi nguồn và thêm link gist của anh ấy thì bài của bạn có giá trị hơn.

+1
thg 8 10, 2018 12:45 CH

@MinhDuc redis về cơ bản nó cũng là một dạng db, đọc ghi bình thường mà 😃

Giả sử user huỷ job lớn thì set một cái key “<job_id>_cancelled” value true.

Trước khi chạy job con nào thì check cái key đó, true thì return luôn không cho chạy nữa chẳng hạn.

+1
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í