Code:
Q2. Practical Task: Design a Distributed Message Queue
You are tasked with designing and implementing a distributed message queue in Java. This message queue must support the following features:
1. Producer/Consumer Pattern: Multiple producers should be able to add messages, and multiple consumers should be able to consume messages concurrently.
2. Message Ordering: Ensure that the messages are consumed in the order they were produced, but only once.
3. High Availability: Implement fault tolerance mechanisms to ensure messages are not lost if a node in the system fails.
4. Scalability: The system should handle a large number of producers and consumers without severe performance degradation.
Provide a high-level implementation of the core components (e.g., Producer, Consumer, Broker) and explain the design decisions you made (e.g., thread safety, use of data structures, and synchronization mechanisms)