Hỏi về đồng bộ trong Java
Hi xin chào mọi người,
<p>
</p>
<p>
Em có 1 ví dụ với ứng dụng banking trong <strong>Spring Boot</strong> như sau :
</p>
<p>
</p>
<p>
Account A hiện đang có 1000$ ( lưu ở DB )
</p>
<p>
</p>
<p>
Có 2 request yêu cầu nạp tiền cùng 1 thời điểm tại account A với số tiền lần lượt là 200$ và 400$
</p>
<p>
</p>
<em><strong>=> Nếu đúng thì accout A sẽ có 1600$</strong></em>
<p>
</p>
<p>
Tuy nhiên trong lúc yêu cầu đầu tiên chưa update DB lại tổng tiền mới (1000$ +200$ = 1200$) thì yêu cầu thứ 2 đang chạy song song <strong>lấy tổng tiền cũ từ DB</strong> nên cũng update dựa trên tổng tiền cũ ( 1000$ + 400$ = 1400$ )
</p>
<p>
</p>
<em><strong>=> Tổng tiền mới sau 2 luồng chạy xong là 1400$ thay vì 1600$. 200$ của luồng 1 do update trước nên bị mất.</strong></em>
<p>
</p>
<p>
Em nghĩ trong Spring Boot nếu chúng ta không lock 1 account khi account đó trong quá trình xử lí thì sẽ gây ra hậu quả như trên.
</p>
<p>
</p>
<p>
Em nghĩ trường hợp như trên trong thực tế cũng có thể xảy ra ạ.Giải pháp xử lí tình trạng trên trong thực tế với <strong>Spring Boot</strong> là như thế nào ạ ?
</p>
<p>
</p>
<em> Em có suy nghĩ đến synchronize nhưng nếu dùng synchronize thì có vẻ ko đúng cho lắm vì có thể nó sẽ lock luôn các luồng của account khác.Em muốn chỉ lock đúng accout mà đang xử lí thôi còn account khác thì cho chạy bình thường.</em>
Đa luồng với Kafka Consumer
Tks a vì câu trả lời !
<p>
</p>
<p>
Em có dùng <strong>@KafkaListener</strong> để nhận tin nhắn sau đó gửi gmail (tốn nhiều thời gian) cho user.Em dùng đa luồng cho chức năng này để giải quyết vấn đề treo thread khi xử lý trong listener (do listener mặc định có 1 thread )
</p>
<p>
</p>
<p>
Em có 2 lựa chọn :
</p>
<ol>
<li>Như em nói ở trên dùng <strong>@Async</strong> và <strong>ThreadPool</strong></li>
<li>Cấu hình số luồng của listener thông qua <strong><em>setConcurrency</em></strong> <em>(như bên dưới)</em></li>
</ol>
<pre><span>@Bean</span>
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<<span>String</span>, <span>String</span>>> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<<span>String</span>, <span>String</span>> <span>factory</span> = <span>new</span> ConcurrentKafkaListenerContainerFactory<>();
<span>factory</span>.setConsumerFactory(consumerFactory());
<span>factory</span>.setConcurrency(<span>5</span>);
......
}
</pre>
<p>
</p>
<p>
Anh cho em hỏi 2 cách này có em nên dùng cách nào hiệu quả hơn và vì sao ạ hoặc n ếu anh có cách nào hay hơn thì mong anh recommend cho em với ạ.
</p>
ThreadPool trong Java
Hi mọi người, hiện tại em có làm 1 chức năng khá tốn nhiều thời gian để xử lý nên em đã áp dụng multi thread mục đích là để xứ lí chức năng đó ở 1 thread khác và để thread chính ko bị treo => trả response về cho client.Cụ thể là sử dụng <em><strong>@Async</strong></em> và có sử dụng thêm <em><strong>ThreadPoolTaskExecutor</strong></em> để cố định size của <strong><em>ThreadPool</em></strong>.
<p>
</p>
<p>
Cho em hỏi là trong thực tế thì người ta sẽ dựa vào những <strong>yếu tố</strong> nào để cấu hình cho các thuộc tính của <em><strong>ThreadPoolTaskExecutor</strong></em> ví dụ như là: <em>CorePoolSize, MaxPoolSize, QueueCapacity, KeepAliveSeconds,.... </em>để đạt được hiểu quả nhất ạ?
</p>
<p>
</p>
<p>
(Em đoán có thể là phần cứng của server có đúng ko ạ )
</p>
<p>
</p>
<p>
Theo em nghĩ nếu cấu hình quá nhiều hoặc quá ít Thread thì hiệu năng sẽ có thể bị ảnh hưởng.
</p>
<p>
</p>
<p>
Cảm ơn mọi người !
</p>
<div>
<div></div>
</div>
Thự tự tin nhắn trong Kafka
Chào mọi người,
<p>
</p>
<p>
Ví dụ trong Kafka e tạo <strong>1 topic</strong> gồm có <strong>5 partition.</strong>Theo em hiểu thì khi 1 Consumer nhận message từ topic thì sẽ nhận được từ message từ tất cả partition của topic đó.
</p>
<ol>
<li>Em muốn hỏi là <strong>Consumer</strong> khi nhận các message từ Kafka (<em>nhiều</em> <em>partition</em>) thì có <strong><em>đảm bảo đúng với với thứ tự được gửi</em></strong> không ạ ?</li>
<li>Nếu câu 1 câu tra lời là <strong>không</strong> đảm bảo thì có cách nào để <strong>đảm bảo</strong> nhận được các message <strong>theo thứ tự</strong> được gửi không ạ ? ( ví dụ 1 chức năng cần xử lý theo 1 tuần tự nhất định)</li>
</ol>
<p>
</p>
Giới hạn bộ nhớ Java
Chào mọi người, em có một thắc mắc muốn hỏi là:
<ol>
<li>Trong ứng dụng Java (Spring) khi chúng ta lập trình thì làm thế nào chúng ta biết cái chức năng của chúng ta đang làm <em><strong>có thể làm hết bộ nhớ của máy chủ (java.lang.OutOfMemoryError: Java heap space)</strong></em> vậy ạ?</li>
<li>Cho em hỏi thêm là 1 ứng dụng Java khi chạy thì có thể chứa bao nhiêu byte cùng 1 lúc ? (Cái này là phụ thuộc vào JVM hay RAM của máy chủ ạ?)</li>
</ol>
<p>
Mọi người cho em xin các cách để tránh tràn bộ nhớ khi lập trình với Java với ạ.
</p>
<p>
</p>
<p>
(ví dụ: Khi chúng ta làm ở local ko có vấn đề nhưng khi deploy thì nhiều người có thể download 1 file nặng cùng 1 lúc thì có thể gây hết bộ nhớ ko ạ?)
</p>
<p>
</p>
<p>
Cảm ơn mọi người !
</p>
Hỏi về AWS S3 + Spring
Em có đang làm ứng dụng<strong> ReactJS + Spring Boot</strong> và có lưu trữ file ở <strong>AWS S3</strong>.
<p>
</p>
<p>
Mọi người cho em hỏi là em muốn hiển thị hình ảnh ở ReactJS thì giữa 2 cách này thì nên áp dụng cách nào ổn hơn ạ ?
</p>
<ol>
<li>Từ <strong>ReactJS</strong> gọi thẳng url của AWS mà Backend cung cấp <em><strong>(Không thông qua Backend)</strong></em></li>
<li>Từ <strong>ReactJS</strong> gọi API của Backend cung cấp để hiển thị hình ảnh <em><strong>(Backend sẽ gọi đến AWS S3 để lấy hình ảnh sau đó sẽ về cung cấp 1 API để trả về hình ảnh cho Client)</strong></em></li>
</ol>
<p>
Cảm ơn mọi người !
</p>
Gửi email trong Spring Boot và RabbitMQ
Hi xin chào mọi người!
<p>
</p>
<p>
Hiện tại em đang tìm hiểu về RabbitMQ sẵn tiện làm thử ứng dụng phổ biến nhất là gửi email dùng Spring + RabbitMQ.
</p>
<p>
</p>
<p>
Em đang bật chế độ <strong>manual</strong> cho <strong>ack </strong>khi nhận tin nhắn từ RabbitMQ ở RabbitListener
</p>
<p>
</p>
<p>
Luồng xử lý của em cơ bản là như thế này:
</p>
<ul>
<li>Khi gửi mail thành công sẽ gọi câu lệnh <em><strong>basic.Ack </strong></em>để thông báo là nhận thành công và RMQ sẽ xóa tin nhắn đó khỏi Queue.</li>
<li>Khi gửi thất bại (nhảy vào catch) thì sẽ gọi câu lệnh <em><strong>basic.Nack </strong></em>để gửi tin nhắn trở lại Queue.</li>
</ul>
<p>
Nhưng vấn đề em gặp phải là nếu gọi câu lệnh <em><strong>basic.Nack </strong></em>thì sẽ bị 1 vòng lặp vô tận => tin nhắn khi requeue xong lại nhận xong lại requeue vô tận.
</p>
<p>
</p>
<p>
Mọi người cho em hỏi là trong trường hợp của em thì nên xử lý như thế nào là ổn nhất với tin nhắn đang bị lỗi đó ạ (Tại vì nếu loop vô tận như v thì sẽ ko ổn tí nào).Có nên lưu tin nhắn ở đâu đó xong 1 khoảng thời gian sau resend 1 số lần nhất định thì có được không ạ?
</p>
<p>
</p>
<p>
Cảm ơn mọi người!
</p>
<p>
</p>
<code></code>
Hỏi về sử dụng thư viện Open source trong Java
Do em còn sinh viên nên em không có nhiều kinh nghiệm trong thực tế nên em có một thắc mắc muốn hỏi mọi người .Mong mọi người giải đáp giúp em ạ
<p>
</p>
<p>
Trong thực tế. em thấy có rất nhiều thư viện Java hay và hữu ích.Khi sử dụng cho hiệu năng cao hơn , tối ưu hơn và đặc biệt giúp ta tiết kiệm thời gian hơn rất nhiều.Đặc biệt là các thư viện bên Trung Quốc (Alibaba,..) và một số tổ chức hay cá nhân khác .
</p>
<ul>
<li><em>Em thắc mắc là trong thực tế thì dự án có dùng các thư viện <strong>Open source</strong> bên ngoài không ạ ? (Không tính những thư viện phổ biến được nhiều người sử dụng ví dụ như <strong>Apache Commons IO</strong>,<strong>Apache POI</strong>...)</em></li>
<li><em> Liệu dùng thư viện <strong>Open source</strong> bên ngoài thì có khuyết điểm hay hạn chế gì ko ạ ?</em></li>
</ul>
<p>
Cảm ơn mọi người !
</p>
Export Excel file với số lượng phần tử lớn
Hi mọi người.
<p>
</p>
<p>
Hiện tại em đang có tìm hiểu về <strong>Export Excel file </strong> sử dụng Apache Poi trong Spring Boot
</p>
<p>
</p>
<p>
Em có thử mock data 1 list có >1000 phần từ thì em thấy chạy rất lâu ( vì phài loop qua từng phần tử một để <strong>set Cell,Row Value</strong> nên rất chậm )
</p>
<p>
</p>
<p>
Mọi người cho em hỏi với trường hợp số lượng phần tử rất lớn (lấy từ DB) ví dụ có thể lên đến 1000,10.000,100.000,.. record thì giải pháp <strong>Export Excel file</strong> sẽ là như thế nào ạ ? Em thấy loop qua từng phần tử như các hướng dẫn trên mạng thì sẽ rất tốn nhiều thời gian ạ.
</p>
<p>
</p>
<p>
Cảm ơn mọi người !
</p>
Hỏi về quản lý bộ nhớ và đa luồng trong java
Hi mọi người, hiện tại kiến thức của em đa số là tự học nên còn nhiều điều thắc mắc mà ko biết hỏi ai nên em muốn hỏi mọi người.Mong mọi người giải đáp giúp em ạ.
<ol>
<li>Khi tạo <strong>1 mảng byte lớn</strong> (ví dụ đến vài MB,GB) thì bộ nhớ mà chương trình Java sẽ dùng để chứa mảng bye đó sẽ dựa vào gì ạ ? RAM hay máy ảo JVM.Có phải PC có RAM dung lượng càng to thì có thể phải tạo nhiều biến dung lượng lớn như vậy cùng 1 lúc ko ạ ?</li>
<li> Làm cách nào để <strong>tải file nặng</strong> trong Java(Em có tìm hiểu thì thấy trên mạng ngta hướng dẫn là dùng Resource của Spring có đúng ko ạ em thấy cách này Spring đã làm hết cho mình rồi nên em muốn hỏi thêm để có thể custom theo ý mình ạ)</li>
<li> Về <strong>đa luồng</strong>, đối với Spring Boot thì việc dùng đa luồng em thấy xử lí rất nhanh những tác vụ nặng (gửi mail,....) trong thực tế thì ngta có dùng đa luồng ko ạ ? Và quan trọng là ngta có giới hạn số luồng Thread Pool theo 1 con số cụ thể nào ko (Ví dụ mình dùng quá nhiều thread thì có vấn đề gì xảy ra ko ạ ?)</li>
</ol>
<p>
Cảm ơn mọi người ạ !
</p>
ByteArrayResource và ByteArray
Hi mọi người! Trong Spring khi viết 1 API trả về 1 file (hình ảnh,excel,..) thì em thường trả về byte[] của file đó và thêm 1 số header để định xác kiểu dữ liệu của file đó.
<p>
</p>
<p>
Cho em hỏi là việc trả trực tiếp byte[] có khác biệt gì so với khi trả về 1 đối tượng ByteArrayResource( byte[]) không ạ ?
</p>
<p>
</p>
<p>
Cảm ơn mọi người !
</p>
<p>
</p>
<p>
</p>
Expose API trả về kiểu Video (giống như Tiktok,..)
Hi mọi người,
<p>
</p>
<p>
Cho em hỏi là ở app Back End (em dùng Java Spring) thông thường theo <strong>em hiểu</strong> là khi expose 1 API để trả về video cho client sử dụng thì quá trình sẽ là :
</p>
<ol>
<li>Chuyển file video thành<strong> mảng byte</strong> (<strong>byte []</strong>)</li>
<li>Set mảng array vào body của Response</li>
<li>Set header của Response <strong>Content-type = video/mp4.</strong></li>
</ol>
<p>
Em nghĩ đây là cách cơ bản nhất.Nhưng em có search thì em thấy để trả về 1 API video thì cần phải có Response có header liên quan đến <strong>Range</strong> của video nữa và hình như <strong>Spring Webflux</strong> có hỗ trợ việc này. <strong>Link</strong> em xem ạ <a href="https://www.youtube.com/watch?v=_PEPaWFs064">https://www.youtube.com/watch?v=_PEPaWFs064</a>
</p>
<ol>
<li>Mọi người cho em hỏi là <strong>Range</strong> này là gì và nó có tác dụng của nó đối với viêc API trả về video ạ ? (Em nghĩ chắc chắn nó sẽ có ưu điểm gì thì người ta mới dùng nó )?Em thấy nó <em><strong>call API liên tục khi video đang chạy thì có gây sập server ko ạ</strong> </em>?</li>
<li>Và cho em xin lời khuyên để làm BackEnd trả về API Video như này thì dùng <strong>Spring Boot</strong> bình thường hay dùng <strong>Spring WebFlux</strong> sẽ tốt hơn ạ ?</li>
</ol>
<p>
Cảm ơn mọi người!
</p>