Multi-tenancy একটি প্রযুক্তিগত কৌশল যা একাধিক গ্রাহক বা "tenant"-কে একটি একক অ্যাপ্লিকেশন বা ডাটাবেসে পরিষেবা সরবরাহ করার জন্য ব্যবহৃত হয়। এটি মূলত ব্যবহৃত হয় SaaS (Software as a Service) অ্যাপ্লিকেশনগুলিতে, যেখানে একাধিক গ্রাহক একি অ্যাপ্লিকেশন ব্যবহার করে কিন্তু তাদের ডেটা একে অপর থেকে পৃথক থাকে।
Hibernate এবং Spring ORM ব্যবহার করে Multi-tenancy বাস্তবায়ন করা সম্ভব, যেখানে বিভিন্ন tenant এর জন্য আলাদা আলাদা ডাটাবেস অথবা স্কিমা ব্যবহার করা যেতে পারে।
Multi-tenancy এর ধরন
- ডাটাবেস পার্টিশন (Database Partitioning): আলাদা ডাটাবেস ব্যবহার করা হয়, যেখানে প্রতিটি tenant এর জন্য আলাদা ডাটাবেস থাকে।
- স্কিমা পার্টিশন (Schema Partitioning): এক ডাটাবেস ব্যবহার হয়, কিন্তু প্রতিটি tenant এর জন্য আলাদা স্কিমা রাখা হয়।
- টেবিল পার্টিশন (Table Partitioning): এক স্কিমা এবং এক টেবিল ব্যবহার করা হয়, তবে tenant_id দিয়ে ডাটা আলাদা করা হয়।
Maven ডিপেনডেন্সি
Spring ORM এবং Hibernate ব্যবহার করতে নিচের ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.1.Final</version>
</dependency>
Multi-tenancy কনফিগারেশন
Hibernate এর সাথে Multi-tenancy কনফিগার করতে আপনাকে কিছু নির্দিষ্ট কনফিগারেশন করতে হবে। নিম্নলিখিত পদক্ষেপে Multi-tenancy কনফিগারেশন বাস্তবায়ন করা হবে।
Step 1: Hibernate Multi-tenancy কনফিগারেশন
Hibernate এর Multi-tenancy সমর্থন করতে নিচের কনফিগারেশন ফাইলটি ব্যবহার করা হয়:
hibernate.multiTenancy=SCHEMA
hibernate.tenant_identifier_resolver=com.example.MultiTenantIdentifierResolver
hibernate.multi_tenant_connection_provider=com.example.MultiTenantConnectionProviderImpl
hibernate.hbm2ddl.auto=update
Step 2: Tenant Identifier Resolver তৈরি করা
Hibernate কে tenant কে চিনতে সাহায্য করতে একটি TenantIdentifierResolver ইন্টারফেস ইমপ্লিমেন্ট করতে হবে। এখানে আমরা TenantContext থেকে tenant আইডি সংগ্রহ করছি।
public class MultiTenantIdentifierResolver implements CurrentTenantIdentifierResolver {
@Override
public String resolveCurrentTenantIdentifier() {
String tenantId = TenantContext.getTenantId();
if (tenantId == null) {
tenantId = "default_tenant"; // default tenant
}
return tenantId;
}
@Override
public boolean validateExistingCurrentSessions() {
return true;
}
}
Step 3: Multi-Tenant Connection Provider তৈরি করা
এই ক্লাসটি Hibernate কে ডাটাবেস কানেকশন প্রদান করবে। এখানে আমরা প্রতিটি tenant এর জন্য আলাদা ডাটাবেস কানেকশন প্রদান করছি।
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {
private DataSource dataSource;
@Autowired
public MultiTenantConnectionProviderImpl(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public Connection getAnyConnection() throws SQLException {
return dataSource.getConnection();
}
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
// Tenant-specific DataSource logic
// You could configure different databases per tenant
return dataSource.getConnection();
}
@Override
public boolean supportsAggressiveRelease() {
return false;
}
@Override
public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
connection.close();
}
}
Entity ক্লাস
Entity ক্লাসের মধ্যে আপনি সাধারণত @Entity অ্যানোটেশন ব্যবহার করেন। Multi-tenancy ব্যবস্থাপনার জন্য কোন অতিরিক্ত অ্যানোটেশন প্রয়োজন হয় না, তবে @Table এর মাধ্যমে প্রতিটি tenant এর জন্য আলাদা টেবিল বা স্কিমা ব্যবহার করতে হবে।
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
Tenant Context তৈরি করা
Tenant তথ্য স্টোর করার জন্য একটি TenantContext ক্লাস তৈরি করা যেতে পারে, যা টেন্যান্ট আইডি পরিচালনা করবে।
public class TenantContext {
private static final ThreadLocal<String> tenantContext = new ThreadLocal<>();
public static void setTenantId(String tenantId) {
tenantContext.set(tenantId);
}
public static String getTenantId() {
return tenantContext.get();
}
public static void clear() {
tenantContext.remove();
}
}
Spring Configuration Class
এটি Spring কনফিগারেশন ক্লাস যা Hibernate এর Multi-tenancy কনফিগারেশন এবং DataSource সাপোর্ট প্রদান করে।
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.repository")
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, DataSource dataSource) {
LocalContainerEntityManagerFactoryBean factoryBean = builder
.dataSource(dataSource)
.packages("com.example.entity")
.persistenceUnit("multiTenantPU")
.properties(hibernateProperties())
.build();
return factoryBean;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.multiTenancy", "SCHEMA");
properties.put("hibernate.tenant_identifier_resolver", "com.example.MultiTenantIdentifierResolver");
properties.put("hibernate.multi_tenant_connection_provider", "com.example.MultiTenantConnectionProviderImpl");
return properties;
}
}
Service Layer
এখন আমরা সার্ভিস লেয়ার তৈরি করতে পারি, যেখানে আমরা tenant-specific ডেটা পরিচালনা করব।
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User saveUser(User user) {
return userRepository.save(user);
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
Controller Layer
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/add")
public ResponseEntity<User> addUser(@RequestBody User user) {
userService.saveUser(user);
return ResponseEntity.ok(user);
}
@GetMapping("/all")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
}
Multi-tenancy এর সুবিধা
- ডেটা আলাদা রাখা: প্রতিটি tenant এর ডেটা আলাদাভাবে সংরক্ষিত থাকে, ফলে নিরাপত্তা নিশ্চিত করা হয়।
- কোড রি-ইউজ: একটিমাত্র অ্যাপ্লিকেশন কোড একাধিক tenant এর জন্য ব্যবহৃত হতে পারে।
- স্কেলেবিলিটি: নতুন tenant যোগ করা বা পুরানো tenant অপসারণ করা সহজ।
Spring এবং Hibernate ব্যবহার করে Multi-tenancy বাস্তবায়ন, একাধিক tenant এর জন্য আলাদা ডাটাবেস বা স্কিমা পরিচালনা করে সিস্টেমের পারফরম্যান্স এবং সিকিউরিটি বৃদ্ধি করতে সাহায্য করে।
Read more