Hiện em đang có chục con server dùng để up file convert và download video từ nhiều nguồn về convert. Nhưng hiện em đang cho sử lý trên từng con server riêng rẽ. Mỗi lần convert khá lâu và chậm. Các bác cho em hỏi có cách nào để em chia 1 video thành nhiều video nhỏ rồi convert trên các server khác nhau từng phần đó, rồi merge lại để giảm thời gian xử lý không ạ?
Mình ko rành về vấn đề này. Nhưng mình thấy không khả thi, nếu có làm dc thì hao tài nguyên nhiều lần so với tự 1 srv làm từ a tới á
Video dài không? Nguồn ở đâu? Convert từ format nào thành format nao? Tại sao phải convert? Hiện tại user phải chờ bao lâu? Muốn nhanh mức nào? .........
Video từ youtube, facebook, instagram, twitch... Download và convert thì em xử lý được rồi ạ! Em chỉ hỏi có thể xử lý convert trên nhiều máy chủ rồi merge lại ko ạ? Và cách nào là khả thi cho việc đó ạ?
thường nếu bạn tách ra và xử lí ở nhiều máy chủ, rồi bạn cũng phải transfer nó về 1 nơi để join mà, làm vậy thì vẫn tốn tgian transfer. mình nghĩ nếu sức mạnh của từng máy chủ có giới hạn (ví dụ server có 8 core 16 thread thì max convert được 16 videos/lần đi), thì bạn nên convert các file trên các máy chủ khác nhau thì đúng hơn, nghĩa là có 5 server, thì fileA sẽ convert trên sv1, fileB trên sv2, kiểu vậy. để làm cái như mình nói thì bạn có thể config load balancing ở nginx, viết 1 API, khi user upload file thông qua API thì sẽ upload lần lượt lên các server thông qua load balancing, rồi convert xong sẽ trả về link dl cho user thôi, v là tiện nhất. hoặc có thể tham khảo RabbitMQ. RabbitMQ sẽ giúp bạn xây dựng 1 queue server và bạn viết script để 5 sv kia lên cái queue server này để lấy file và convert, convert xong thì bắn signal cho 1 con central để trả data cho user. 2 cách, 1 cách là chủ động, 1 cách là bị động
thường nếu bạn tách ra và xử lí ở nhiều máy chủ, rồi bạn cũng phải transfer nó về 1 nơi để join mà, làm vậy thì vẫn tốn tgian transfer. mình nghĩ nếu sức mạnh của từng máy chủ có giới hạn (ví dụ server có 8 core 16 thread thì max convert được 16 videos/lần đi), thì bạn nên convert các file trên các máy chủ khác nhau thì đúng hơn, nghĩa là có 5 server, thì fileA sẽ convert trên sv1, fileB trên sv2, kiểu vậy. ban đầu em cũng sợ là mất nhiều thời gian tách và transfer, nhưng sau em có giải pháp để tách là để từng server tự lấy 1 phần file theo khoảng thời gian về, Youtube-dl hỗ trợ được điều đó. Còn join các file ở các server thì hơi chuối, nên em sẽ sử dụng 1 lan và chung 1 mount để lưu chung các phần đã convert trên 1 máy duy nhất, như vậy em sẽ giảm được thời gian upload từ server này sang server khác. Nhưng vấn đề của em lại xuất hiện thêm là nếu em gọi các server convert qua API thì rất khó để biết được khi nào convert xong để tiến hành merge lại. Nếu sử dụng gọi tuần tự thì mất luôn cái mục tiêu ban đầu, sử dụng nhiều server convert cho nhanh, còn nếu sử dụng bất đồng bộ thì ko biết khi nào cần merge ạ
xây dựng cơ chế master-slave thôi bạn ơi, nghĩ sao thì code vậy, từ từ cũng sẽ xong thôi. Thấy khó thì 1 máy làm 1 file video thôi, chia file đấy ra nhiều phần làm gì cho phức tạp
nếu vậy bạn dùng NodeJS, viết cái app, mỗi server sẽ run app đó, ví dụ: localhost:3000 (dùng nodejs vì nó hỗ trợ bất đồng bộ tốt, không thì Python mà táng) nhiệm vụ của app là cho phép user upload file lên và convert, sau đó trả về kết quả và hiển thị cho user luôn. như vậy, lúc này nginx chỉ là load balancing cho cái app thôi, nó có trách nhiệm điều hướng các yêu cầu upload file đến các server. thành ra, kq là mỗi server sẽ convert nguyên 1 file luôn. mình thấy như vậy vừa dễ manage, vừa dễ deploy các server khác nhau, ngày xưa, ryushare của anh gì ở Bình Dương, cái script file hosting cũng chạy kiểu đó đó
Em làm xong được convert 1:1 rồi ạ! Nhưng Sếp muốn tối ưu bằng cách chia file ạ! Khó mới có thịt chó mà ăn, nên em đành động não với nhờ các bác chỉ giáo thêm để em có chút cơm ạ! --- Double Post Merged, Mar 17, 2021, Original Post Date: Mar 17, 2021 --- Hay quá, cách của bác đúng là rất ok ạ! Tks bác, em sẽ xử lý theo hướng bác đưa xem thế nào!
nói với sếp là 9 người phụ nữ trong 1 tháng chưa chắc đẻ được 1 đứa đâu. Nhưng 9 tháng họ đẻ 9 đứa thì hoàn toàn có thể. Nếu cần file cực gấp, tốc độ cực nhanh thì phải chia, tất nhiên là mệt mỏi. Lúc đấy cần xây dựng hệ thống hàng đợi, phân task/quest thôi. Thì gắn flag cho nó, update flag mỗi khi convert xong. Cái này là kiến thức cơ bản lập trình
Xử lý download file bằng youtube-dl là xử lý trên server, nó gọi server to server, về cơ bản lệnh gọi là qua CURL thì đặt cờ kiểu gì để check bác? Với nữa nó là quá trình chứ có responve về luôn đâu, nên sử lý CURL thế nào để nó gửi lại được bác?
Bạn mô tả dịch vụ của bạn vẫn chưa rõ nên chả biết giúp kiểu gì. Tui lấy ví dụ dịch vụ của bạn là download video từ youtube cho user. Khi user paste 1 link youtube và bấm nút download thì tool của bạn bắt đầu hoạt động và trả kết quả cho user. Tuy nhiên, nếu chờ tool xong xuôi mới trả cho user thì sẽ rất lâu => user phải chờ thông qua hàng đợi. ==> khắc phục bằng cách dùng pipe => sử lý được bao nhiều trả luôn user bấy nhiêu => user sẽ không phải chờ mà download dc luôn.
https://convert-video-online.com/ Dịch vụ của em là khi người dùng điền link youtube, facebook ... vào và điền đầu ra muốn định dạng gì. Thì em bắt đầu download về server và tiến hành convert. Cách của bác cũng hay, nhưng em chưa hiểu là nếu chưa có file đầu ra thì làm sao để biết nó nặng bao nhiêu để mà show cho người dùng ở phần kết quả ạ?
Nếu mình gặp phải bài toán như chủ thread thì mình sẽ xử lý bằng cách sử dụng 1 thằng message broker (Cá nhân mình thì mình sẽ dùng thằng RabbitMQ). Khi server nhận được request từ client sẽ pub message vào queue để phân tán ra các worker xử lý video một cách tuần tự. Còn việc lấy file size thì sau khi bác get được link video thì bác request đến lấy cái header Content-Length là đc
Đâu cần phải có filesize mới show dc. Còn nếu chỉ hiện size cho user xem mà không liên quan đến quá trình dl-convert thì có nhiều cách mà. Lấy từ api, youtube-dl, remote filesize.....
Sợ quá, đào mộ site này của thớt thì giờ thành 1 hệ thống cực khủng rồi, huhu cho xin chia sẻ kinh nghiệm với người ae thiện lành.