๐ Essential Java Applications: NoSQL, Messaging, and Caching for Modern Development
In modern Java applications you rarely work with the language alone — you rely on databases, messaging systems, and caches to build scalable, resilient systems. This post covers three essential technologies for Java developers: MongoDB (NoSQL persistence), Apache Kafka (event streaming), and Redis (caching). Each section includes practical Spring examples, configuration hints, and best practices.
1. ๐️ MongoDB (Document Database)
MongoDB is a document-oriented NoSQL database that stores JSON-like documents (BSON). It is schema-flexible, supports replication and sharding for scale, and integrates well with Spring via Spring Data MongoDB.
Key Concepts
- Collections — groups of documents (analogous to tables).
- Documents — records in BSON/JSON format (analogous to rows).
- Sharding & Replication — horizontal scaling & high availability.
Spring Data MongoDB — Example
Create a document class and repository:
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private int age;
// getters/setters
}
public interface UserRepository extends MongoRepository<User, String> {
// Derived query
List<User> findByName(String name);
// Custom JSON query
@Query("{ 'email' : ?0 }")
Optional<User> findByEmail(String email);
}
MongoTemplate (when you need more control)
Use MongoTemplate for complex queries, aggregations, and operations that don't map well to repository methods:
@Autowired
private MongoTemplate mongoTemplate;
public List<User> findActiveUsersOlderThan(int age) {
Query q = new Query(Criteria.where("active").is(true).and("age").gt(age));
return mongoTemplate.find(q, User.class);
}
Spring Boot Properties
spring.data.mongodb.uri=mongodb://user:password@host:27017/mydb
spring.data.mongodb.database=mydb
Notes & Best Practices
- Index frequently queried fields (e.g., email, userId) — avoids collection scans.
- Use projections or DTOs to avoid fetching unnecessary fields in large documents.
- Avoid very large documents; prefer references or sub-collections if necessary.
- Use
MongoTemplatefor aggregation pipelines and bulk operations. - Consider connection pooling and monitoring (MongoDB Atlas or metrics exporters).
2. ๐ Apache Kafka (Event Streaming)
Apache Kafka is a distributed, durable publish-subscribe messaging system built for throughput and fault tolerance. It’s widely used for event-driven architectures, stream processing, and decoupling services.
Core Concepts
- Producer — sends messages to topics.
- Topic — named stream of records, divided into partitions.
- Partition — unit of parallelism; ordering is per-partition.
- Consumer — subscribes to topics and processes messages.
- Broker — Kafka server process; a cluster is multiple brokers for HA.
- Streams & Connect — Kafka Streams for processing; Kafka Connect for integrations.
Spring Kafka — Producer Example
// Producer config (Java-based)
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String,Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return new DefaultKafkaProducerFactory<>(props);
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
// Sending a message
kafkaTemplate.send("orders", orderId, orderJson);
Spring Kafka — Consumer Example
@KafkaListener(topics = "orders", groupId = "order-service")
public void receive(String payload, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
// Process message
}
Configuration Snippet (application.properties)
spring.kafka.bootstrap-servers=kafka:9092
spring.kafka.consumer.group-id=order-service
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.producer.retries=3
Notes & Best Practices
- Design topics and partitions by throughput and consumer parallelism needs.
- Keep messages immutable and small; store large payloads in object storage and use references.
- Use appropriate key selection to control partitioning & ordering (e.g., customerId).
- Use consumer groups to scale processing horizontally.
- Consider exactly-once semantics (EOS) for critical workflows—evaluate performance trade-offs.
- Use Kafka Streams or ksqlDB for inline stream processing needs.
3. ⚡ Redis (In-memory Cache & Data Structures)
Redis is an in-memory key-value data store commonly used as a cache, session store, or transient data layer. It supports advanced data types (strings, hashes, lists, sets, sorted sets) and TTL/eviction policies.
Spring Cache Integration
Enable caching in Spring Boot and use annotations for common caching patterns:
@Configuration
@EnableCaching
public class CacheConfig {
// Optionally configure RedisConnectionFactory or Lettuce/Jedis client
}
@Service
public class UserService {
@Cacheable(value = "users", key = "#userId", unless = "#result == null")
public User getUserById(String userId) { ... }
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) { ... }
@CacheEvict(value = "users", key = "#userId")
public void deleteUser(String userId) { ... }
}
Notes & Best Practices
- Cache read-heavy, relatively static data: user profiles, product catalogs, feature flags.
- Set appropriate TTLs to avoid serving stale data and to limit memory usage.
- Use
CacheEvictfor write-through or write-around patterns to keep cache & DB consistent. - Prefer Redis clusters for production to handle failover and sharding.
- Monitor memory usage and eviction events; set sensible maxmemory and eviction policy.
4. ๐ Summary Table
| Technology | Purpose | Typical Integration | Spring Support |
|---|---|---|---|
| MongoDB | NoSQL document storage | Schema-flexible persistence, sharding & replication | Spring Data MongoDB (MongoRepository, MongoTemplate) |
| Kafka | Event streaming & messaging | High-throughput pub/sub, stream processing | Spring Kafka, Kafka Streams, Kafka Connect |
| Redis | In-memory cache & fast data structures | Session store, caches, counters, leaderboards | Spring Cache with Redis, Spring Data Redis |
5. ๐ Practical Tips & Best Practices
- Monitor everything: metrics, lag (Kafka), cache hit rates, DB slow queries.
- Design for failure: retries with backoff, idempotency, dead-letter topics (Kafka).
- Keep messages & documents small: large payloads -> external object store + reference.
- Prefer managed services (MongoDB Atlas, Confluent / cloud Kafka, managed Redis) if you want to reduce operational overhead.
- Security: enable TLS, auth, and RBAC for production deployments.
- Versioning: version your message schemas (Avro/Protobuf/JSON Schema) to evolve producers/consumers safely.
6. ๐ Final Notes
These three technologies — MongoDB, Kafka, and Redis — form the backbone of many modern Java systems. Together they help you persist flexible data, build event-driven systems, and dramatically improve performance through caching.
Labels: Java, MongoDB, Kafka, Redis, Spring, Spring Boot, NoSQL, Messaging, Caching, Microservices
Comments
Post a Comment