Ccu Là Gì

Truyền thuyết nói rằng, vào một ngày công ty nhật đẹp mắt ttách, Minh Monmen đột nhiên nảy ra phát minh vẫn tốt ho thế như thế nào giả dụ mình dựng một cái dashboard để khám nghiệm CCU của hệ thống theo thời hạn thực. Một ý tưởng cực kỳ fancy nếu như không nói về vấn đề tại sao lại yêu cầu bày vẽ làm phần nhiều thiết bị mà rất nhiều thằng khác ĐÃ LÀM RỒI với LÀM NGON HƠN nlỗi Google Analytics, Firebase Analytics,... Tất cả việc của họ nên làm chỉ với cắn nó vào với phần đông thứ đã chuẩn bị.

Bạn đang xem: Ccu là gì

*

But no, vốn là một trong bạn sẵn tính đa nghi, mình hoài nghi tưởng lắm vào các hiện tượng, và chỉ còn coi GA các đẳng cấp là một một số loại tmê say chiếu thôi. Và đặc biệt quan trọng rộng, bản thân cần hoàn toàn kiểm soát điều hành được số lượng nhưng mà mình tạo thành, phát âm nó bao hàm không nên số gì, nó gồm ý nghĩa nạm làm sao, tại vì sao này lại những điều đó,... Ttuyệt bởi vì nhắm đôi mắt gật đầu đồng ý với cùng một số lượng vô năng nào kia và tự hỏi bản thân về ý nghĩa thật sự của bọn chúng.

Don"t Reinvent The Wheel, Unless You Plan on Learning More About Wheels

Đây là tiêu đề 1 nội dung bài viết bản thân hiểu được bên trên codinghorror.com về việc ko phát minh sáng tạo lại bánh xe cộ Lúc những người khác đang tiến hành nó tốt nhất rồi. Vậy nên nếu như khách hàng là 1 coder đơn thuần và không quan tâm tới túng thiếu ẩn sau số đông số lượng, bạn cũng có thể vứt đi, bởi vì phần đông bài toán phía tiếp sau đây mình làm hồ hết là reinvent the wheel

First things first

Trước lúc trở lại câu truyện xe cộ pháo, xin dành 1 phút nhằm lưu niệm sự hiện diện của tác giả Minch Monmen, tín đồ tuy nhiên thực hiện code chỉ trong một ngày nhưng mà lại mất cho tới 5 ngày nhằm ghi chnghiền lại quá trình tìm hiểu của bản thân bên trên tuyến đường mang đến với những học thức (cũ). Nghề nghiệp tuyệt chứng trạng sức khỏe, hôn nhân, giới tính của người sáng tác thì nguyễn y vân nên sẽ không được kể tiếp ở chỗ này.

Chắc chắn nội dung bài viết này sẽ rất dài với bao gồm lúc còn buộc phải bóc tách ra có tác dụng mấy phần không giống nhau, bắt buộc làm cho chúng ta gồm thêm rượu cồn lực thì mình vẫn tổng kết trước 1 số ít điều cơ mà tôi đã học tập được sau một ngày hặm hụi xây đắp khối hệ thống đo CCU này:

Hiểu được đo lường và thống kê CCU hết sức cạnh tranh (of course).Có thời cơ thực hành thực tế 2 yếu tố nhưng mà mình ấp ôm tự lâu: siêu nhanh cùng khôn cùng thực (tức là ko thực tế =))).Thuật tân oán đếm ngay gần đúng cực kỳ nhanh hao khôn xiết nhẹ: HyperloglogIn-memory caching (loại nghiêm túc)Batch processing (dạng hình xịn xò)Sử dụng tài nguim đúng cách (mẫu mã tiết kiệm 1 cách tởm lợm)Cuối thuộc là kết luận: Công nghệ KHÔNG làm vận dụng của người sử dụng chạy nhanh khô rộng. BẠN mới là tín đồ có tác dụng điều này....

Và tương đối nhiều điều không giống nhưng mình không chỉ học tập được để gia công hệ thống này, ngoại giả để áp dụng mang đến không ít bài bác tân oán khác nhưng mà tôi cũng sẽ hoa mắt. Có như thế mới biết Thiết kế lại dòng bánh xe góp bản thân không đa số có thể bước đi xe, cơ mà còn làm xe pháo có thể bước đi mình nữa.

Còn đấy là các kiến thức và kỹ năng bạn cần chuẩn bị nhằm tiếp cận cùng với nội dung bài viết này:

CCUGolang (do phần nhiều implement sử dụng golang nên tìm hiểu thì sẽ tốt hơn)Time series data: dữ liệu chuỗi thời gianProbabilistic data: tài liệu ước lượngRedisPrometheus, grafana (dùng để làm thu thập tài liệu và màn trình diễn đồ dùng thị)Lòng can đảm với đê mê học hỏi (đây là lắp thêm quan trọng nhất)

Tạm cụ, nhào vô.

Mấy cái kỹ năng cơ bản

Nếu đang hợp tác bắt chân vào có tác dụng web, ứng dụng thì tất yếu ai ai cũng sẽ tối thiểu 1 lần được nghe cho tới CCU, tên tường Hotline là kon ku, tuyệt Concurrent Users, Có nghĩa là số user đồng thời so với một khối hệ thống. Định nghĩa thì nó chỉ nôm mãng cầu với dễ dàng và đơn giản nhỏng vọc.

*

Định nghĩa thì dễ dàng những điều đó nhưng mà tính CCU thay nào, với CCU gồm ý nghĩa sâu sắc ra sao cùng với các bạn lại lại một câu chuyện hoàn toàn khác. Không gồm một bí quyết đúng mực làm sao có thể áp dụng mang lại toàn bộ những khối hệ thống cũng chính vì mỗi bí quyết đo CCU lại cho bạn 1 chân thành và ý nghĩa không giống nhau. Ví dụ:

Với những khối hệ thống thời hạn thực nhỏng game, chat,... và những user mtại 1 connection vĩnh viễn cho tới hệ thống nlỗi socket,... thì CCU hoàn toàn có thể được đo bằng phương pháp đếm số lượng connection cho tới hệ thống tại một thời điểm. Con số này có thể dùng để cho bạn biết năng lực Chịu đựng thiết lập của hệ thống, tính tân oán giới hạn, lên plan phần cứng,...Với những hệ thống web bình thường không sử dụng connection vĩnh viễn dạng hình website thông tin, web bán hàng,... thì CCU có thể được đo bằng phương pháp đếm số lượng client request tới hệ thống trong 1 khoảng thời gian. Con số này cũng nói lên 1 phần lượng traffic nhưng bạn cần đáp ứng nhu cầu, mặc dù tùy thuộc vào từng khối hệ thống ví dụ thì nó cần được kết hợp với số request được tạo nên tới khối hệ thống, đặc điểm từng request,... thì chúng ta mới gồm tầm nhìn đúng chuẩn hệ thống của mình.

Trong bài viết này, bản thân sẽ đề cập tới hình trạng tính CCU mang đến phần lớn các hệ thống website, ứng dụng hiện tại là ko thực hiện connection vĩnh viễn cơ mà dựa vào HTTP.. request của user.

Làm sao nhằm từ tính được CCU

Thông thường cùng với các hệ thống analytic thông thường các bạn sẽ thuận tiện theo dõi và quan sát được các chỉ số nhỏng DAU, MAU, toàn bô request trong 1 khoảng thời gian,... với chúng ta trọn vẹn có thể sử dụng những chỉ số này nhằm ước lượng CCU. Tuy nhiên đa số số lượng này chỉ tạm dừng ở tại mức ước lượng. quý khách hoàn toàn có thể biết một ngày các bạn gồm 100K active sầu user, tuy nhiên số user này đâu tất cả phân bố đồng đều? CCU của bạn khi ấy có thể chỉ triệu tập vào 1 số ít thời khắc hot mà thôi.

Và tất nhiên là chưa phải chúng ta cứ mong trường đoản cú tính CCU là rất có thể tính được đâu nhé. Hệ thống của chúng ta buộc phải đáp ứng được đầy đủ một số ít điều kiện ở cả phía client cùng server.

Client

Để rất có thể tổng hợp được CCU thì client cần có tác dụng một chiếc gì đó nhằm phía server ghi dấn người tiêu dùng hiện tại đang active sầu. Đó rất có thể là:

1 request khởi sản xuất sessionhoặc 1 request ping (ví dụ 1 phút ít lại ping hệ thống 1 lần)hoặc 1 request tiến hành 1 action làm sao kia nhỏng hiểu, ghi dữ liệuCao cấp hơn là client trường đoản cú ghi dấn thời hạn user bám dính trên ứng dụng xuất xắc website (cơ mà hoàn toàn có thể gửi sau cho tới server)...

Cơ chế thịnh hành độc nhất và chính xác duy nhất thường xuyên được những các loại phầm mềm, web thực hiện là tạo ra 1 request ping đơn lẻ cho tới server. Request này hoàn toàn có thể chỉ gồm chân thành và ý nghĩa ping, cũng có thể cất thêm nhiều công bố được gói gọn khác. Nhưng quan trọng là nó được client Gọi để báo đến hệ thống biết là user đã active sầu trên phầm mềm.

Request ping hoàn toàn có thể được điện thoại tư vấn định kỳ 10s, 20s, 60s xuất xắc vài phút 1 lần tùy vào điểm lưu ý phiên thao tác của từng ứng dụng.

Server

Có 2 cách đo đạc CCU phía server:

một là tracking lẻ tẻ request ping. Nếu client vẫn hỗ trợ ping cho tới server định kỳ thì bài toán độc nhất vô nhị phía VPS yêu cầu làm chính là theo dõi và quan sát request này.2 là lúc request ping chăm biệt ko khả dụng, thì cần phải có 1 lớp middleware nhằm can thiệp vào hồ hết endpoint (hoặc nhiều phần endpoint) của khối hệ thống. Đây chỉ với phương pháp để khắc phục và hạn chế Việc client không tồn tại request ping chăm biệt, sẽ tạo ra những không đúng số.

Bởi vày vận dụng của mình không hỗ trợ ping request, buộc phải mình đã cẩn thận cùng áp dụng bí quyết thứ hai sau khi nhận thấy phong cách xây dựng khối hệ thống của bản thân tương xứng cùng với giải pháp làm cho này.

Khó khăn uống ck chất

Vạn sự mở màn nan, khó khăn bắt đầu chán nản. Sau Khi hợp tác vào thực hiện thì mình đã vấp nên đa số khó khăn lẫn cả về phương diện số liệu cùng bao gồm cả khía cạnh công nghệ như sau:

Xác định 1 CCU

Trông vậy mà phía trên lại là 1 thắc mắc khôn xiết khó trả lời. Lúc nào thì chúng ta tính 1 CCU? Đó bao gồm cần là khi có một user như thế nào đó login vào trang web của bạn? Hay là tính cả user không đăng nhập? Vậy 1 user sử dụng 2 tab thì tính là mấy CCU? Hay thậm chí là là những request trường đoản cú bot google, facebook, mặt máy 3,... vào hệ thống cũng tính 1 CCU?

Lúc làm cho mới thấy vấn đề làm sao nhằm xác minh 1 CCU thôi cũng confuse rồi. Và lại 1 đợt nữa là thắc mắc này cũng không tồn tại câu trả lời mà vấn đề vấn đáp ra sao trọn vẹn tùy trực thuộc vào khối hệ thống của bạn có cung cấp ko, đưa định của người sử dụng về business với giải pháp chúng ta đồng ý con số kết quả.

Bởi bởi vì bản thân ko control được phần lên tiếng của client, thế nên tôi đã chấp nhận thực hiện rất nhiều lên tiếng cơ mà bản thân gồm sẵn về 1 client vào từng request sau:

User ID: Có được trường đoản cú session/token của userClient IP: Có được tự tầng proxy/gateway bên ngoàiUser Agent: Có được trường đoản cú request header

Sau lúc phối hợp 3 đọc tin đó lại, bản thân đạt được 1 cách định danh 1 CCU sát đúng.

Tại sao lại gần đúng? Bởi do sẽ có nhiều case 1 client hotline request gồm token/không token, hoặc 1 client msống những tab không giống nhau, hoặc 1 IPhường. chứa được nhiều client đơn lẻ, hoặc những client có thông thường user-agent...

1 CCU tồn tại trong bao lâu

1 CCU được ghi thừa nhận vẫn mãi mãi trong bao lâu?

Đó là câu hỏi chúng ta yêu cầu vấn đáp tiếp theo so với những hệ thống không tồn tại connection vĩnh viễn. User chỉ cửa hàng với khối hệ thống của họ qua các request đơn thân, do vậy CCU chỉ gồm chân thành và ý nghĩa khi bọn họ lắp nó với cùng một khoảng chừng thời hạn như thế nào đó. Ví dụ: Trong 1 phút, số tín đồ thuộc truy vấn vào hệ thống là 1000 người - Tức là trong 1 phút ít sẽ tất cả 1000 user khác biệt truy vấn vào khối hệ thống.

Việc chắt lọc timeframe là 1 trong phút ít, 3 phút ít tốt 10s, 20s,... phụ thuộc vào trọn vẹn vào cách chúng ta phát âm về khối hệ thống của chính mình. lấy ví dụ với những hệ thống gồm liên quan qua request với gia tốc mập thì timeframe đã sút cùng ngược lại.

Tại đây bản thân quan niệm hệ thống của mình gồm 3 mức: (điều này hoàn toàn là vì mình tự phịa ra với không dựa trên 1 lý thuyết làm sao cả nên có thể mang tính chất xem thêm cho những bạn)

Mức PEAK: Là nút thời hạn nhỏ dại độc nhất vô nhị (sử dụng làm cho mức time base nhằm đếm). Mình mang theo cực hiếm khoảng chừng thời hạn nhiều năm độc nhất vô nhị giữa 2 request từ bỏ client. Có ý nghĩa tương quan tới số request vào 1 thời điểm peak xuất phát điểm từ bao nhiêu client và được Điện thoại tư vấn là Peak CCU. lấy ví dụ như phầm mềm của chính bản thân mình chu trình 1 phút ít lại gọi 1 request nào đấy tới server thì thời gian dài tuyệt nhất giữa 2 request của client đã là một phút. Tuy nhiên con số này hoàn toàn có thể không đúng mực lúc không xuất hiện phần đông request chu kỳ, hoặc client xử lý 1 tác vụ nào này mà KHÔNG CẦN call cho tới server.Mức SESSION: Là mức thời hạn vừa phải. Mình lấy theo giá trị xung quanh ngưỡng thời hạn vừa phải 1 session của user. Con số này có chân thành và ý nghĩa cẩn thận trong khoảng thời hạn 1 session thì có từng nào user đang mở ra. Mình call con số này là Session CCU. Đôi khi thì con số này đã đề đạt đúng đắn CCU hơn Khi nó tổng quan cả các user sẽ truy cập vào app tuy thế không tạo ra tác vụ nào tương quan tới server hoặc ko được mô tả qua CCU thời điểm. lấy một ví dụ ứng dụng của bản thân bao gồm thời lượng Time On App mức độ vừa phải là 5 phút ít thì mình vẫn đem 5 phút để gia công nấc thời gian đo Session CCUMức LIMIT: Là nút thời gian nhiều năm độc nhất vô nhị còn cẩn thận để tính CCU. Mức thời gian này thường xuyên được năng động phụ thuộc vào thử khám phá, tuy nhiên mình thường xuyên đặt tại mức 3~>6 lần Mức SESSION. Mục tiêu là để mắt tới lưu lại lượng truy cập vào hệ thống một cách bao quát trong time frame đầy đủ nhiều năm nhằm Review chất lượng với giới hạn của những chiến dịch push lôi kéo visitor. lấy ví dụ áp dụng 2 lần peak CCU liên tục thì liệu lần peak sau sẽ giúp hệ thống có bao nhiêu traffic new tốt chỉ toàn các traffic cũ? Khoảng thời hạn này cũng tránh việc nhiều năm quá bởi vì nó sẽ ảnh hưởng trộn loãng cùng làm cho mượt số trong thời gian nhiều năm. Mình thường xuyên chọn khoảng thời hạn trường đoản cú 15~>trong vòng 30 phút mang đến mức time LIMIT và gọi số lượng này là Limit CCU

*

Đếm quality CCU

Sau lúc sẽ tất cả giải pháp định danh 1 CCU với thời hạn tính CCU rồi, vậy ta làm phương pháp làm sao để đếm quality CCU khoảng thời hạn đó? Đếm quality cùng với số không nhiều có thể là bài toán đơn giản và dễ dàng, nhưng khi số request lên đến hàng chục, hàng trăm ngàn ndại dột request trong 1 khoảng tầm thời hạn nđính thì nhằm kiếm được số unique CCU trong các số đó lại không hẳn bài tân oán dễ dàng với hối hả.

Ý tưởng trước tiên nảy mang lại vào đầu Lúc động cho tới bài tân oán này chính là thực hiện redis set. Redis Set là một trong những dạng hình dữ liệu của Redis chất nhận được tàng trữ 1 mảng ko lặp lại các bộ phận. Ta có thể thuận tiện thêm phần tử với đếm số thành phần của 1 mix cùng với đều commvà có độ phức tạp O(1).

Thế nhưng lại thực hiện Redis Set cùng với dạng dữ liệu string như trên có nhiều nhược điểm:

Tốc độ union thấp (độ phức hợp O(n) với n là số bộ phận của các tập hợp). Điều này khiến quá trình tính toán thù cho các khoảng chừng thời gian lớn hơn chậm trễ hơn rất nhiều (ví dụ tính số quality CCU trong 5 phút ít bằng phương pháp phối hợp 5 key CCU của từng phút)Sử dụng không hề ít ram bởi tài liệu được lưu giữ bên dưới dạng string mix. Mặc mặc dù ta rất có thể tiết kiệm ngân sách bằng phương pháp convert lại quý hiếm user_id-client_ip-user_agent thành chuỗi hash ngắn thêm, cơ mà số lượng ram quan trọng nhằm tàng trữ data cho CCU vẫn rất lớn.

Xem thêm: Ahegao Là Gì, Giải Thích Ý Nghĩa Của Từ Ahegao Đầy Đủ Nhất, Ahegao Nghĩa Là Gì

May mắn cố, nếu như bạn sẽ phát âm bài viết trước của bản thân mình về Analytic cho tất cả những người nông dân: Bài toán thù đếm số thì tôi đã bao gồm đề cập 1 thuật tân oán ra đời để cách xử trí công việc này. Đó đó là Hyperloglog.

Hyperloglog là thuật toán tính toán thù giao động các giá trị không giống nhau vào tập đúng theo, thuật toán này có độ đúng đắn cao nhưng mà vẫn giữ được dung tích tài liệu nhẹ nhàng, hỗ trợ những operation liên quan cho tới đếm thành phần trong 1 hoặc nhiều tập phù hợp. Và quan trọng đặc biệt tuyệt nhất là nó cực kỳ nhanh. Superfast ví như bọn họ tổ chức dữ liệu hợp lí.

Nhắc lại nhẹ 1 chút ít kiến thức và kỹ năng tự nội dung bài viết trước. Chi tiết về hyperloglog các bạn cũng có thể google thêm nhé. Còn tại đây tạm thời biết vậy đang. Mình có thể giữ lại dữ liệu CCU đúng mực đến từng phút ít trong 1 khối hệ thống vài ba chục triệu request từng ngày chưa đến 10MB ram.

Tích phù hợp với các hệ thống sẵn có

Đây là phần kha khá khoai nghiêm sắn lúc trong 1 thời hạn nlắp (1 ngày) để bản thân có thể tích phù hợp được câu hỏi đếm CCU vào khối hệ thống vốn sẽ tinh vi ngày nay. Để mang đến đơn giản thì bản thân có thể biểu hiện khối hệ thống của mình nhỏng sau:

*

Giờ bản thân đang can thiệp vào lớp middleware nhằm can thiệp vào những request. Việc này đựng được nhiều rủi ro khủng hoảng liên quan cho tới performance của khối hệ thống vày middleware là lớp tác động cho tới hầu hết request từ bỏ client. Và thực tế lúc tiến hành thì mình đã test được performance của tầng middleware của mình giảm 1 nửa.

Một điểm thuận lợi không còn vơi là mặt mình đã gồm sẵn hệ thống monitor bởi Prometheus + Grafana. Do vậy việc của chính bản thân mình từ bây giờ chỉ gồm Việc thu thập tài liệu trường đoản cú middleware cùng export dữ liệu ra Prometheus là hoàn toàn có thể xem chart được trên Grafamãng cầu rồi.

Bắt tay vào thực hiện

Nói dông dài điều đó là nhằm các bạn đọc được bản chất của vấn đề solve sầu problem trong xây dựng. Thời gian ta mất nhằm tiến hành giải 1 bài xích toán thì vô cùng nhanh khô (nhỏng mình chỉ việc 1 ngày), tuy vậy thời gian ta mất để có đủ kiến thức giải quyết bài bác toán thù ấy thì tương đối nhiều 1 chút nào. Toàn cỗ phần đông kiến thức bên trên tôi đã mất nhiều tháng triển khai các dự án công trình tương quan cho tới tracking, analytic, desgin phong cách xây dựng hệ thống, monitoring,... new đã có được. Mình đã khôn cùng nỗ lực chọn lựa để bài viết rất có thể xúc tích và dễ nắm bắt nhất rất có thể. Các các bạn hãy thường xuyên quan sát và theo dõi nhé.

Action plan

Đây là đa số step mình đã làm cho nhằm thu thập dữ liệu:

khi có 1 request tới khối hệ thống, tạo nên định danh CCU bằng vấn đề kết hợp thông tin: user_id-client_ip-user_agent.Để có 1 tầm nhìn sâu hơn về chỉ số CCU, bản thân parse user-agent để nhấn diện thiết bị nhưng mà người tiêu dùng sử dụng. Cụ thể là phân các loại sơ cỗ client thành quả táo, game android, web_pc, web_Mobile, other.Tạo ra 1 cỗ key bên trên redis tương xứng với Mức PEAK, làm việc đó là từng phút nhằm lưu hyperloglog, ta Gọi là bucket. Mỗi loại client đang có một bucket riêng.

Hết phần data collector. Tiếp phần data exporter.

Định kỳ Prometheus đã hotline tới endpoint của data exporter để mang metrics.

Hết phần data exporter. Cuối cùng là dùng Grafamãng cầu để vẽ chart. Cái này easy vượt thôi không nói =)))

Chấp nhận 1 user có không nên số

Oops, vào quy trình run demo bản thân phạt hiển thị có không ít những trường hòa hợp gây sai số cho doanh nghiệp khi định danh 1 CCU:

Các request trường đoản cú bên sản phẩm công nghệ 3.Các request từ 1 client tuy thế tới public API cùng private API sẽ không giống nhau về bài toán cất hay là không đựng token.Các request từ một user login nhiều tài khoản với các định danh tương tự nhau....

Rất những lắp thêm làm cho ảnh hưởng cho tới câu hỏi xác minh 1 request đã đạt được xem như là từ là 1 CCU bắt đầu ko. Chính vày vậy nhằm hạn chế hạn chế này thì tôi đã tách thành 2 cỗ chỉ số đơn nhất là:

CCU đo bởi quality user (chỉ áp dụng logged-in user cùng với định danh là user_id nhằm đếm)CCU đo bởi unique session (thực hiện định danh IP + user-agent + user_id nhằm đếm)

Nhờ bao gồm 2 chỉ số này, bản thân bao gồm một cái chú ý bao quát và đúng chuẩn rộng về lượng user trong hệ thống, bao gồm cả khía cạnh số user (đúng chuẩn hơn nhưng thiếu guest) với session (kém nhẹm đúng chuẩn rộng nhưng bao quát hơn)

Chấp dấn cả khối hệ thống bao gồm không nên số

Sự hy sinh tiếp sau là về tính chuẩn xác của dữ liệu. Như mình đã kể sinh sống trên, nếu như tính CCU bởi Redis Set thì vẫn mang lại số đúng mực rộng. Tuy nhiên để tiết kiệm bộ nhớ lưu trữ, cũng như tăng vận tốc trong vấn đề union giữa các bucket thì tôi đã đồng ý sử dụng Redis Hyperloglog để tính toán thù.

Với xác suất không đúng số hơi rẻ (Parse user-agent để phân một số loại requestGọi PFĐịa chỉ cửa hàng gấp đôi nhằm thêm định danh vào bucket khớp ứng.

Mặc dù vấn đề parse user-agent với hotline redis được chạy trọn vẹn async, có nghĩa là phản hồi lại mang lại user xong xuôi mới thực hiện, tuy vậy kết quả benchmark middleware của chính mình đang sụt giảm như sau:

------ Before implement ------Requests per second: 17332.91 <#/sec> (mean)Time per request: 5.515 (mean)------ After implement ------Requests per second: 7644.02 <#/sec> (mean)Time per request: 10.027 (mean)Đó trái là một sự hy sinh tương đối mập đúng không? Hy sinh 1 nửa performance chỉ để phục vụ việc đo đạc. Vì vậy nên mình không chấp nhận nhưng mà liên tiếp tìm giải pháp tối ưu thêm. Sau quy trình thử nghiệm đi test lại vài ba tiếng đồng hồ đeo tay (vụ về tối ưu này mới thọ này) thì mình đã tìm ra nguyên nhân để cho ứng dụng của chính bản thân mình buộc phải quyết tử nhiều performance nhỏng vậy:

Việc parse user-agent để phân các loại request hay khá chậm bởi bắt buộc check qua nhiều loại regex không giống nhau. (~1ms/op)Gọi PFADD mặc dù gồm độ tinh vi O(1) và đã thực hiện redis pipeline (có tính năng nlỗi bulk command) nhưng lại vẫn tiêu tốn tương đối nhiều tài nguyên với network. Thậm chí tác động cả tới vận tốc của operation chủ yếu (cũng dùng redis)

Giờ hãy thuộc phân tích coi chúng ta cũng có thể làm những gì với 2 sự việc này.

Vấn đề đầu tiên là nâng cao vận tốc của việc parse user-agent. Xuất phân phát từ những việc user agent của tiện ích hay web là lặp lại giữa những request của một user, thậm chí là là giữa các user gồm sản phẩm công nghệ như thể nhau. Do vậy mình đã nghĩ về tới phương án cache in-memory, tức là cần sử dụng những phương án tàng trữ vươn lên là toàn bộ để cache lại tác dụng parse user agent.

Tất nhiên là mình ko dở hơi nhưng đi tự suy nghĩ ra tuồng cabít in-memory này. Trước giờ đồng hồ mình chỉ quen thuộc cùng với sử dụng redis như 1 lớp cache. Bây giờ tới mức redis còn vẫn lờ lững vãi xoài thì đành đề nghị tìm phương pháp không giống. Thật tình cờ trong một buổi sáng lướt tin tức nơi nào đó thì tôi đã hiểu được 2 bài blog về các thư viện in-memory cađậy của Golang: The State of Caching in Go với Introducing Ristretto: A High-Performance Go Cabịt. Vậy là mình đưa ra quyết định áp dụng ristretkhổng lồ. Quá trình benchmark của bản thân mình rất nhiều cho thấy thêm mức độ áp dụng RAM ở tại mức tốt với tốc độ ý kiến ấn tượng. Done 1 câu hỏi.

Vấn đề sản phẩm 2 là nâng cao luồng ghi đọc tin vào redis bởi PFShowroom comm&. Với vấn đề từng request tới khối hệ thống lại cần Gọi 2 command trên thì khả năng connection tới redis có tác dụng đủng đỉnh khối hệ thống đang xảy ra. Mình tất cả đi retìm kiếm không ít vị trí, rồi cả những danh sách awesome này nọ tuy thế cũng chưa suy nghĩ ra cách gì khả dĩ. Sau đó bản thân trợ thời gác này lại để đi tìm kiếm gọi vấn đề khác trước.

Nhưng đúng vào lúc mình đang tìm hiểu về khả năng thread-safe của thỏng viện redis trên golang thì có 1 comment vào issue đang knhị sáng mình: https://github.com/go-redis/redis/issues/166#issuecomment-149360999.

Ý tưởng sinh sống đấy là sử dụng cơ chế y hệt như buffer / flush nhằm cách xử lý. Mà nghỉ ngơi đấy là thực hiện 1 thỏng viện rất là cũ kỹ và còn được archive luôn của facebook là Muster nhằm cách xử lý internal batching. Tức là mọi request cho tới redis sẽ tiến hành bản thân push vào 1 chiếc batch nội bộ process. Định kỳ 1s hoặc 10000 request thì mình sẽ flush dòng batch nội cỗ trên xuống redis bởi redis pipeline. Việc này tiết kiệm chi phí được khôn cùng rất nhiều tài nguim và tránh giảm làm cho nghẽn client redis của bản thân.

Wow, trái là 1 trong những phạt kiến trân quý tới mức sững sờ. Mình đã làm implement loại tlỗi viện trên và đấy là kết quả:

------ Before implement ------Requests per second: 17332.91 <#/sec> (mean)Time per request: 5.515 (mean)------ After implement #1 ------Requests per second: 7644.02 <#/sec> (mean)Time per request: 10.027 (mean)------ After implement #2 ------Requests per second: 16592.69 <#/sec> (mean)Time per request: 6.027 (mean)Tôi đã nhằm phía trên và không nói gì cả.

Thành quả

Bỏ qua phần râu ria liên quan cho tới vấn đề bản thân viết chiếc data exporter tốt có tác dụng 1 loại graph grafana đơn giản dễ dàng với các metric:

Concurrent Session (PEAK, SESSION, LIMIT) by (device type)Concurrent User (PEAK, SESSION, LIMIT) by (device type)User TOA (time on app) by (device type)

thì mình đã thành công vào câu hỏi implement câu hỏi đo CCU theo thời hạn thực bên trên toàn hệ thống nhưng mà ko có tác dụng ảnh hưởng rất nhiều tới khối hệ thống đang chạy. Phải không?

Kết luận

Đến phía trên, mình xin khnghiền lại nội dung bài viết hết sức dài với căng thẳng nói về một ngày chủ nhật hứng chí của mình. Rất cảm ơn chúng ta sẽ kiên trì theo chân mình sắp tới. Mặc dù bản thân luôn bảo các bạn đừng tuân theo mình mà lại trường hợp ai kia mong test mức độ thì hãy cứ đọng demo nhé. Bởi vì chưng số đông sản phẩm công nghệ bản thân học tập được trên tuyến đường đi gần như bổ ích và có tương đối nhiều áp dụng giữa những project không giống của bản thân.

Qua bài viết này mình đúc kết 3 điều (kể lại):

Reinvent the wheel mang về cho bạn nhiều sản phẩm cơ mà chỉ khi bạn đích thực đọc được mình đang làm cái gi.Khi chạm chán sự việc vượt khó khăn giải quyết, hãy ma-ke-no (mặc kệ nó) cùng đi làm thiết bị khác. Rồi tự nhiên và thoải mái câu trả lời vẫn va thẳng vào phương diện các bạn trước khi bạn kịp trsinh hoạt tay.Công nghệ - 1 lần tiếp nữa - không hỗ trợ áp dụng của bạn chạy nkhô cứng rộng. Bạn mới là tín đồ có tác dụng điều đó.

Hết rồi.