THẢO LUẬN

thg 9 27, 2024 8:47 SA

hi vọng có thêm phần "thay vào đó" hoặc "để giải quyết vấn đề này thì" trong comment tới của bạn

0

Làm khóa AWS đi idol hóng quá còn chưa biết xong vụ series K8S chưa :v

0

Cái này mình dựa vào template trong log4j2 nhé sóp, tuỳ vào log mà mình cấu hình, kia là mình ví dụ ạ

0

"dữ liệu log request và response mà bạn đã cung cấp", cái này b để ở đâu thế, cho mình xem log example

0

hello bạn, thực tế hiện tại mình thấy nhiều cty đã và đang dùng MFE nhiều dần rồi đó bạn. Khi mình viết bài này thì nhiều bạn nhắn tin hỏi mình và mình thấy là ở VN người cũng đã dùng dần rồi.

Và khi mình từ cty cũ làm MFE vô cty mới cũng thấy họ đang làm MFE còn mạnh hơn cty cũ nữa (cũng module federation các kiểu).

Còn việc chi phí + maintain thì tuỳ cách ta vận hành sao cho thích hợp thôi bạn, nó mà khó và cao hơn thì đã chẳng grow và có người dùng. Mình cũng làm MFE từ cty cũ sang cty mới mình cũng có thể thấy được điểm mạnh/yếu của nó, đánh giá nếu phù hợp dùng thì vẫn oke thôi.

Chắc do use case của bạn chưa thích hợp thôi 😁

(Và bởi vì thấy có nhiều người quan tâm nhắn mình nên mình mới quyết định viết thành 1 series từ 1 tuần trước, thay vì chỉ mỗi bài này)

0

Kể cả cty lớn cũng chẳng dùng MFE đâu bạn à. Trừ khi project đó nuôi cả cty ví dụ như tiki, nab. Google, Fb chỉ sử dụng Monorepo để quản lý các project thôi, còn đây là dạng kiến trúc cho các big project nên mình nghĩ bạn cũng k cần phải hiểu nó quá kỹ

0

Cảm ơn bạn nha. Thực tế các công ty rất ít dùng Micro Frontend. Cơ bản vì nó rất khó tích hợp cũng như maintain sau này. Chi phí để code & maintain dự án có khi còn cao hơn cách thông thường. Mà website hiện nay ko to đến mức mà phải sử dụng micro-frontend.

0
thg 9 26, 2024 4:37 SA

thanks b 🙌

0

câu trả lời đang được update lên dần r nha bác

0

câu trả lời đang được update lên dần r nha bác

0

câu trả lời đang được update lên dần r nha bác

0
thg 9 26, 2024 2:59 SA

hay

0
thg 9 25, 2024 9:08 SA

Như này vẫn chưa giải quyết được vấn đề ghi dữ liệu đúng không anh? Trong 1 cụm K8s có master có thể ghi data. Nếu phân tải ra các VPS khác nhau thì việc ghi dữ liệu cũng phải thao tác vào Master. Nếu thế thì phải làm thế nào khi Concurrency quá cao vậy anh? Cảm ơn anh vì bài viết chi tiết và dễ hiểu.

0
Avatar
đã bình luận cho bài viết
thg 9 25, 2024 8:27 SA

@Tafi Khá hiếm gặp Builder trong thực tế, và cũng ít trường hợp có thể áp dụng. Nếu không hiểu rõ Builder thì có thể gặp phải cái goi là quan liêu trong thiết kế. Cá nhân thì tôi cũng không chắc việc dùng Builder trước đây có ok không. Nhưng có một số dấu hiệu khi dùng Builder:

  • Constructing phức tạp.
  • Constructor + Factory Method không thỏa mãn.
  • Product object gần như immutable.

Một vài ví dụ tìm được:

  1. UrlBuilder

Đây là Builder đơn giản gặp cả trong Java và .Net. UrlBuilder mạnh hơn constructor + Factory nhờ:

  • Khả năng tùy biến đơn giản hơn (absolute, relative url, query params, protocols).
  • Hạn chế lỗi (chẳng may kết xuất url khi chưa đủ thông tin).
  • Kết quả sau cuối là string - immutable.
  1. HostBuilder (WebHostBuilder)

Cái này bên .Net, tìm bên Java Springboot không có cái nào trùng tên (nhưng có thể có cái cùng chức năng mà không biết).

HostBuilder cung cấp nhiều giao diện để config một Host trước khi chạy. Điều này constructor và Factory khó có thể cung cấp (hoặc để cung cấp cần quá nhiều parameters, overloading).

Kết quả coi như immutable (Host sau khi build sẽ chạy suốt runtime)

  1. ReportBuilder

Cái này thì implement trước đây, cung cấp các giao diện buildHeader, Body, Footer, kết xuất cuối cùng là xml hoặc html. Dùng builder khác gì so với report.AddHeader(), report.AddBody()...?

  • Hạn chế lỗi không mong muốn (render report khi chưa đủ các thành phần)
  • Chia nhỏ các bước để giảm độ phức tạp cũng như tăng khả năng tái sử dụng.

Kết quả cuối cùng cũng là immutable (xml string, html string).

Cách này có vẻ dễ gặp trong thực tế khi xử lý các bài toán convert từ một dạng này sang một dạng khác. Các cái tên liên quan như Parser, Renderer. Bắt buộc phải qua nhiều bước xử lý để có kết quả cuối cùng nên constructor, Factory không tham gia được. Kết quả cuối cùng cũng có thể coi là immutable khi không còn nhu cầu xử lý trên nó nữa.

+1

@ManhNguyen98 ầu sết, thanks e đã phát hiện 🙏

0
thg 9 25, 2024 7:14 SA

Chào A ! A cho e hỏi, khi em cài Plugin như vậy, mình click mà chữ danh mục đã tạo thì nó ko show ra bài viết danh mục đó,thì có cách nào show ra không a ?

0
thg 9 25, 2024 7:11 SA

Hi ! Cảm ơn bạn rất nhiều nha,chắc sắp tới ổn nhờ 1 đội code về làm luôn ak

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 9 25, 2024 6:47 SA

@nourist

//#include <cstdint>
//#include <time.h>
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double

const int limit = 1e8 + 8;

namespace bitsetSieve {
	uint64_t p[limit / 64 + 11];

	bool test(int idx) {
		return (p[idx / 64] & (1ULL << (idx % 64))) == 0;
	}

	void mark(int idx) {
		p[idx / 64] |= (1ULL << (idx % 64));
	}

	void sieve() {
		mark(0);
		mark(1);
		for (int i = 3; i * i < limit; i += 2) {
			if (test(i)) {
				for (int j = i * i; j < limit; j += i * 2) {
					mark(j);
				}
			}
		}
	}
}

namespace bitsetSieve2 {
	uint32_t p[limit / 32 + 11];

	bool test(int idx) {
		return (p[idx >> 5] & (1 << (idx % 32)));
	}

	void mark(int idx) {
		p[idx >> 5] &= ~(1 << (idx % 32));
	}

	void sieve() {
		const uint32_t bit1 = ~0;
		memset(p, bit1, sizeof p);
		p[0] = bit1 - 3;
		register uint32_t* pointer = bitsetSieve2::p;
		for (int i = 3; i * i < limit; i += 2) {
			register int i2 = i % 32;
			if(i2 == 1) {
				++pointer;
			}
			if ((*pointer) & (1 << i2)) {
				for (int j = i * i; j < limit; j += i * 2) {
					p[j >> 5] &= ~(1 << (j % 32));
				}
			}
		}
	}
}

namespace boolSieve {
	bool p[limit];
	
	void sieve() {
		memset(p, 1, sizeof p);
		p[0] = p[1] = 0;
		for (int i = 3; i * i < limit; i += 2) {
			if (p[i]) {
				for (int j = i * i; j < limit; j += i * 2) {
					p[j] = 0;
				}
			}
		}
	}
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	clock_t start = clock();
	boolSieve::sieve();
	cout << "bool sieve: " << clock() - start <<"ms"<< endl;

	start = clock();
	bitsetSieve2::sieve();
	cout << "bitset sieve: " << clock() - start <<"ms"<< endl;

	for(register int i=0; i<limit; ++i) {
		if(boolSieve::p[i] != bitsetSieve2::test(i)) {
			cout << i << " - Error! " << endl;
			break;
		}
	}

	return 0;
}

Nếu sửa lại để dùng 32bit thì nhanh hơn này

Output:

bool sieve: 1207973ms

bitset sieve: 726665ms

Link test: https://onecompiler.com/cpp/42t7s5m7j

0
Avatar
đã bình luận cho bài viết
thg 9 25, 2024 4:39 SA

Builder có giá trị khi buildPart là một hàm phức tạp. Các phần code ví dụ lại quá đơn giản, cuối cùng lại call constructor của Product nên không thể hiện được ý nghĩa của Builder.
=> Tôi cũng cân nhắc làm ví dụ phức tạp nhưng trong nội dung bài viết thì tôi ưu tiên viết ngắn gọn tránh việc anh em khó đọc, khó theo dõi
=> Đoạn call constructor tôi chưa hiểu, bro cho tôi 1 ví dụ để hiểu rõ hơn cách bro implement builder. Quan điểm của tôi là constructor thì vẫn phải gọi, quạn trọng là gọi ở chỗ nào thôi.

Một tác dụng khác của Builder là không cần phải tạo đối tượng ngay lập tức mà có thể chia ra thành nhiều bước, khi các yếu tố hội tụ mới cần build hoàn chỉnh. Các bước có thể phụ thuộc vào nhau để tránh sai sót.
=> Đồng ý

Điều gì khác nhau giữa dùng Car Builder.BuildVF3() so với new VF3() : Car()? Điều gì khác nhau giữa Builder và Factory?
=> Vấn đề cần giải quyết của 2 pattern là khác nhau, tôi ko thấy sự liên quan, tuỳ vào nhu cầu cần sử dụng mà áp dụng. Ví dụ, cần nhiều step phức tạp để tạo ra product thì dùng builder, factory ko có vai trò gì trong TH này

Không rành về Java nhưng private constructor thì làm cách nào new được object đấy nhỉ?
=> Ý đồ là ép caller phải gọi thông qua builder nhưng cuối cùng thì vẫn phải có chỗ nào đấy gọi new Car(). Mà constructor set về private, không gọi được new từ bên ngoài nên mới cần đưa class CarBuilder vào làm nested class bên trong Car.

0
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í