Spring Batch একটি শক্তিশালী ফ্রেমওয়ার্ক যা ব্যাচ ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আমরা বৃহৎ পরিমাণ ডেটা প্রসেস করতে পারি, তবে কখনও কখনও একটি নির্দিষ্ট স্টেপের জন্য একাধিক থ্রেড বা প্রসেসর ব্যবহার করে Parallel Processing (প্যারালাল প্রসেসিং) কার্যকরী করা যায়, যা অ্যাপ্লিকেশনটির কার্যকারিতা এবং পারফরম্যান্স উন্নত করতে সাহায্য করে।
Parallel Processing ব্যবহারের মাধ্যমে আপনি একাধিক আইটেম একযোগভাবে প্রক্রিয়া করতে পারেন, ফলে ডেটা প্রসেসিং আরও দ্রুত হয়ে ওঠে। Spring Batch এর মধ্যে প্যারালাল প্রসেসিংয়ের জন্য বেশ কয়েকটি পদ্ধতি রয়েছে, যেমন Multi-threaded Step, Partitioned Step, এবং Remote Chunking।
এই টিউটোরিয়ালে আমরা Multi-threaded Step এর উদাহরণ সহ Parallel Processing এর ব্যবহার শিখব।
Parallel Processing এর ধারণা
Parallel Processing হল একটি কৌশল যেখানে একাধিক কাজ (task) একই সময়ে একাধিক থ্রেড বা প্রসেসের মাধ্যমে চালানো হয়। Spring Batch এ প্যারালাল প্রসেসিং মূলত ডেটা প্রক্রিয়ার সময়কে কমাতে সাহায্য করে, এবং ডেটা সঠিকভাবে এবং দ্রুতভাবে প্রক্রিয়া করা সম্ভব হয়।
Spring Batch এ Parallel Processing এর জন্য প্রধান তিনটি পদ্ধতি রয়েছে:
- Multi-threaded Step: একটি Step এর ভিতরে একাধিক থ্রেড ব্যবহার করা হয়।
- Partitioned Step: একটি Step কে একাধিক ছোট ছোট ভাগে বিভক্ত করা হয়, এবং প্রতিটি ভাগ আলাদাভাবে প্রসেস করা হয়।
- Remote Chunking: ডেটা চাঙ্কগুলি পারস্পরিক যোগাযোগের মাধ্যমে একাধিক রিমোট সার্ভারে প্রক্রিয়া করা হয়।
এখানে, আমরা Multi-threaded Step এর মাধ্যমে প্যারালাল প্রসেসিংয়ের উদাহরণ দেখব।
Multi-threaded Step
Multi-threaded Step পদ্ধতিতে একটি Step এর মধ্যে একাধিক থ্রেড ব্যবহার করা হয়, এবং প্রতিটি থ্রেড আলাদাভাবে এক একটি আইটেম প্রক্রিয়া করে। এটি সাধারণত ছোট, স্বাধীন কাজের জন্য ব্যবহৃত হয়, যেমন একাধিক আইটেম প্রক্রিয়া করা বা ডেটা ফাইল থেকে পড়ে করা।
উদাহরণ: Multi-threaded Step এর মাধ্যমে Parallel Processing
ধরা যাক, আমাদের একটি Spring Batch Job তৈরি করতে হবে, যেখানে আমরা ItemReader থেকে ডেটা পড়ব এবং ItemWriter এ লেখার আগে প্রতি আইটেমকে প্যারালালভাবে প্রসেস করব। এতে প্রতিটি আইটেমকে একাধিক থ্রেড দ্বারা প্রসেস করা হবে।
Batch Configuration
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job parallelProcessingJob() {
return jobBuilderFactory.get("parallelProcessingJob")
.start(parallelProcessingStep())
.build();
}
@Bean
public Step parallelProcessingStep() {
return stepBuilderFactory.get("parallelProcessingStep")
.<String, String>chunk(10) // প্রতি ১০টি আইটেমে চাঙ্ক
.reader(myItemReader()) // Custom ItemReader
.processor(myItemProcessor()) // Custom ItemProcessor
.writer(myItemWriter()) // Custom ItemWriter
.taskExecutor(taskExecutor()) // Multi-threaded Execution
.throttleLimit(4) // ৪টি থ্রেড একসাথে কাজ করবে
.build();
}
@Bean
public ItemReader<String> myItemReader() {
return new MyItemReader(); // Custom ItemReader
}
@Bean
public ItemProcessor<String, String> myItemProcessor() {
return new MyItemProcessor(); // Custom ItemProcessor
}
@Bean
public ItemWriter<String> myItemWriter() {
return new MyItemWriter(); // Custom ItemWriter
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4); // মিনিমাম থ্রেড ৪টি
executor.setMaxPoolSize(8); // সর্বাধিক থ্রেড ৮টি
executor.setQueueCapacity(10);
executor.initialize();
return executor;
}
}
এখানে:
- chunk(10): প্রতি ১০টি আইটেমের জন্য একটি চাঙ্ক প্রসেস করা হবে।
- taskExecutor(): এখানে
ThreadPoolTaskExecutorব্যবহার করা হয়েছে, যার মাধ্যমে থ্রেড পুল কনফিগার করা হয়েছে। এটি প্যারালাল প্রসেসিংয়ের জন্য থ্রেড চালানোর কাজ করে। - throttleLimit(4): সর্বাধিক ৪টি থ্রেড একসাথে কাজ করবে।
Custom ItemReader, ItemProcessor, এবং ItemWriter
এখন, আমরা Custom ItemReader, ItemProcessor এবং ItemWriter তৈরি করব।
public class MyItemReader implements ItemReader<String> {
private List<String> data = Arrays.asList("Item1", "Item2", "Item3", "Item4", "Item5");
private int index = 0;
@Override
public String read() throws Exception {
if (index < data.size()) {
return data.get(index++);
}
return null; // No more data
}
}
public class MyItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String item) throws Exception {
return item.toUpperCase(); // প্রতি আইটেমকে uppercase এ কনভার্ট করা
}
}
public class MyItemWriter implements ItemWriter<String> {
@Override
public void write(List<? extends String> items) throws Exception {
for (String item : items) {
System.out.println("Writing item: " + item); // কনসোলে লেখার উদাহরণ
}
}
}
এখানে:
MyItemReaderক্লাসটি একটি ফিক্সড ডেটা তালিকা থেকে ডেটা রিড করছে।MyItemProcessorক্লাসটি প্রতিটি আইটেমকে uppercase তে কনভার্ট করছে।MyItemWriterক্লাসটি আইটেমগুলো কনসোলে প্রিন্ট করছে।
Parallel Processing এর সুবিধা
- দ্রুত প্রক্রিয়াকরণ: Parallel processing ব্যবহারের মাধ্যমে ডেটা দ্রুত প্রক্রিয়া করা যায়।
- কনকারেন্ট প্রসেসিং: একাধিক থ্রেড ব্যবহার করে একাধিক কাজ একসাথে করা যায়।
- পারফরম্যান্স উন্নয়ন: অধিক থ্রেডের মাধ্যমে কাজের গতি বৃদ্ধি পায়, বিশেষ করে বৃহৎ পরিমাণ ডেটা প্রসেসিংয়ে।
সারাংশ
Spring Batch এ Parallel Processing ডেটা প্রসেসিংকে দ্রুত এবং কার্যকরী করতে সাহায্য করে। এখানে আমরা Multi-threaded Step এর মাধ্যমে প্যারালাল প্রসেসিং দেখলাম, যেখানে একাধিক থ্রেড ব্যবহার করে ডেটা প্রসেস করা হয়। এর মাধ্যমে একটি নির্দিষ্ট Step এর মধ্যে একাধিক কাজ একযোগে চালানো যায়, যা ব্যাচ প্রসেসিংয়ের গতি বৃদ্ধি করে। Spring Batch এ এই ধরনের পদ্ধতি ব্যবহার করে আপনি বৃহৎ পরিমাণ ডেটা দ্রুত এবং দক্ষতার সাথে প্রসেস করতে পারবেন।
Read more