Xây web bán lẻ
<div class="markdown-block">Em chào mọi người ạ. Hiện tại em đang xây 1 web bán lẻ sử dụng cho 4 cơ sở kinh doanh. Nhưng vẫn còn khá nhiều thắng mắc về chi phí vận hành khi đưa lên production và những thứ em cần trả phí là gì và trong tầm giá bao nhiêu ạ. Mong anh/chị đã có kinh nghiệm giải đáp giúp em ạ.</div>
Cấu trúc dự án
<div class="markdown-block">Cho em hỏi trong 1 dự án Spring boot. Thì sẽ Controller -> Service -> RepoVậy trong Service luôn gọi qua Service khác. hay gọi qua repo khác thì ổn hơn ạ.Ví dụ: Service A có repo A, service B, repo C, D.. vì chỉ gọi những câu jpa đơn giản. Best practice thì sẽ như nào ạ</div>
Api có gửi file dùng spring boot
<div class="markdown-block">Cần truyền xuống thông tin là 1 list Customer gồm: name, type, và 1 danh sách Document gồm documentType và file public class CustomerInfo {private String customerName;private String customerType; files;}public class CustomerFileDTO {private String documentType;private MultipartFile file;}Cách nào là tối ưu nhất để xử lý đưa list customer này xuống và lấy được file vậy ạ. Cho e xin cách truyền request xuống dễ xử lý với ạ. list customer này max size =5 vì nó đẩy xuống để lưu thông tin của 1 phiếu xử lý</div>
Gửi Nhận Cookie Từ Backend Và Frontend Khác Domain
<div class="markdown-block">Xin chào mọi người, hiện tại em làm một project cá nhân chạy trên localhost với spring và html thuần. Ở phía backend(port:8080) và frontend(port:8085) và cả 2 em đều đã cấu hình chạy trên https (<a href="https://localhost).Em" class="markdown-link" target="_blank">https://localhost).Em</a>có case như sau, khi thực hiện login từ backend em có set cookie như thế này:</div><div class="markdown-block">private void setTokenCookie(String tokenType, String token, long ttl, HttpServletResponse servletResponse) {</div><div class="markdown-block">if (servletResponse == null) {</div><div class="markdown-block">throw new AppException(ErrorCode.INTERNAL_SERVER_ERROR, "HttpServletResponse is null");</div><div class="markdown-block">}</div><div class="markdown-block">ResponseCookie tokenCookie = ResponseCookie.from(tokenType, token)</div><div class="markdown-block">.httpOnly(true)</div><div class="markdown-block">.secure(true) </div><div class="markdown-block">.path("/")</div><div class="markdown-block">.maxAge(Duration.ofSeconds(ttl))</div><div class="markdown-block">.sameSite("None")</div><div class="markdown-block">.build();</div><div class="markdown-block">servletResponse.addHeader("Set-Cookie", tokenCookie.toString());</div><div class="markdown-block">}</div><div class="markdown-block">Tiếp theo khi thực hiện logout:</div><div class="markdown-block">const response = await fetch(logoutApiUrl, {</div><div class="markdown-block">method: "POST",</div><div class="markdown-block">credentials: "include",</div><div class="markdown-block">headers: {</div><div class="markdown-block">"Content-Type": "application/json",</div><div class="markdown-block">Authorization: <code class="markdown-inline markdown-inline-code">Bearer </code>,</div><div class="markdown-block">},</div><div class="markdown-block">});</div><div class="markdown-block">private</div>
Spring JPA
<div class="markdown-block">Hiện e đang sửa máy nên em ko test được thực tế. cho e hỏi hàm YEAR() trong spring data jpa để trong @Query như vậy có hoạt động không ạ, em đang dùng spring boot 3.3.x và db postgresql ạ @Query("SELECT trans FROM Transaction trans WHERE YEAR(trans.tDate) = :year ") findByYear(@Param("year") int year, Pageable pageable);</div>
traceId kafka spring boot
<div class="markdown-block">Em đang dùng spring boot 3.4.3 jdk 21, và kafka, khi lắng nghe kafka và gọi api ở service thì muốn nó tự động có traceId graylog thì làm như nào ạ. api thì nó tự động có traceId nhưng khi tự lắng nghe từ kafka lại ko có ạ.</div>
Config nhiều datasource
<div class="markdown-block">Em đang dùng spring boot 2.7. x. e cần config 2 data source vào ạ. Một DB em dùng mặc định config như bình thường ở properties và map với entity và repo của em. Một DB em chỉ dùng map với1 tới 2 DAO gọi native query. Anh có config sample cho em xin hướng dẫn với ạ. Có phải em chỉ cần config 1 cái cho datasource phụ thôi, còn cái default chính của em thì spring boot cũng đã config và ưu tiên cái đó không ạ. Em cũng muốn config trong properties và java. Không config xml ạ</div>
Tối ưu xử lý
<div class="markdown-block">Em có câu query cần Union All 2 bảng lại để lấy data trả về 1 chuỗi data của các cột nối nhau bằng dấu |ví dụ: username|code|name|.....Số lượng reocord lúc query ra thì 1M record. Em đang dùng Spring boot. Theo anh thì nên giới hạn số lượng mỗi lần query lên rồi gọi nhiều lần xuống DB. Hay là gọi 1 lần thì hơn ạ. Data em bắt buộc lấy đủ . Và em nên nối chuỗi bằng câu native query hay là lấy dữ liệu lên rồi xử lý bằng Java hơn ạ. để xử lý và zip lại thành file data trả về luôn. Hướng xử lý tối ưu nhất là gì ạ a.</div>
Kiểm tra tối đa request trong ngày trên 1 thiết bị
<div class="markdown-block">Em có làm 1 web không yêu cầu login, nhưng khi đẩy form xuống BE thì BE phải check là tối đa 1 thiết bị trong 1 ngày chỉ được 3 request. Có cách nào check vấn đề này được ko ạ. nếu em dùng tab ẩn danh, hay ip động hay có cách nào khác nó có thể spam được không ạ. Em chưa có hướng code cho đoạn này.</div>
Tối ưu xử lý khi data nhiều
<div class="markdown-block">Em có 1 service api dùng spring boot gọi xuống DB để lấy data lên, data này có cỡ 1 triệu record. Web dùng spring boot MVC gọi api qua service đó để lấy data và down xuống file txt theo từng dòng và nén nó thành file zip. Service đó xử lý lâu dẫn tới timeout, có cách nào để tối ưu ở service và web của em không ạ.</div>
Không hiểu kiểu gì luôn?
<div class="markdown-block">Hi anh Dũng, cả nhà mình,Em đang gặp vấn đề như sau:Lưu 1 object xuống db, sau đó dùng id của object đó push vào kafka, đoạn code mô tả bên dưới:var saveResult = this.repo.saveAndFlush(entity);this.kafkaTemplate.send(topic, saveResult.getId());Tuy nhiên khi listen topic trên thì thi thoảng vẫn có những trường hợp em gọi hàm findById bị not found. Vậy có phải là việc listen topic trên diễn ra trước lúc transaction được commit ko nhỉ? Và cũng xin mọi người cách để giải quyết bài trên ạ(Em đang dùng spring boot cả nhà ạ)</div>
Cấu hình Async và Cluster cho Kafka
<div class="markdown-block">Em chào anh ạ. Hiện tại em đang làm 1 project kết nối giữa kafka và mongodb, em đang thực hiện như sau: , application.yml</div><div class="markdown-block">spring:</div><div class="markdown-block">mongo:</div><div class="markdown-block">enabled: false</div><div class="markdown-block">hosts:</div><ul class="markdown-list"><li class="markdown-list-item"><div class="markdown-list-item-content"> host: 192.168.101.43</div><div class="markdown-block">port: 27017</div></li></ul><div class="markdown-block">username: chatbot</div><div class="markdown-block">password: chatbot@vtcc</div><div class="markdown-block">authSource: chatbot_platform</div><div class="markdown-block">kafka:</div><div class="markdown-block">bootstrap:</div><div class="markdown-block">servers: 192.168.101.43:9092, 192.168.101.69:9092</div><div class="markdown-block">topic:</div><div class="markdown-block">name: notification</div><div class="markdown-block">orderName: order</div><div class="markdown-block">topic-json:</div><div class="markdown-block">name: notification</div><div class="markdown-block">orderName: order</div><div class="markdown-block">consumer:</div><div class="markdown-block">group: myGroup</div><div class="markdown-block">orderGroup: orderGroup</div><div class="markdown-block">username: kafka</div><div class="markdown-block">password: 123456aA@</div><div class="markdown-block">, AsyncConfig</div><div class="markdown-block">@Configuration</div><div class="markdown-block">public class AsyncConfig {</div><div class="markdown-block">@Bean(name = "asyncTask")</div><div class="markdown-block">public ThreadPoolTaskExecutor asyncTask() {</div><div class="markdown-block">ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();</div><div class="markdown-block">executor.setCorePoolSize(10); // Số lượng luồng cố định</div><div class="markdown-block">executor.setMaxPoolSize(50); // Số lượng luồng tối đa</div><div class="markdown-block">executor.setQueueCapacity(100); // Số lượng tác vụ chờ trong hàng đợi</div><div class="markdown-block">executor.setThreadNamePrefix("asyncTask-");</div><div class="markdown-block">executor.setKeepAliveSeconds(60);</div><div class="markdown-block">executor.initialize();</div><div class="markdown-block">return executor;</div><div class="markdown-block">}</div><div class="markdown-block">@Bean</div>