🎤 Top 81 Interview Questions
These are the most commonly asked Java interview questions — tap to reveal the answer.
Ek architectural style jaha ek application ko chhote, independent services ke collection ki tarah banaya jaata hai — har service ek specific business capability ko implement karti hai.
Monolith, ek single deployable unit hai (poora code ek codebase mein). Microservices mein, har team independently kaam kar sakti hai — different rates par deploy ho sakti hain.
Independent scaling, technology flexibility, aur fault isolation — ek service down hone se poora system down nahi hota.
Network latency, data consistency challenges, aur operational complexity — multiple services deploy/monitor karne padte hain.
Ek naya project monolith se shuru karna aur growth ke saath gradually microservices mein migrate karna — kai successful companies ne ye approach follow kiya hai.
Jab team large hai, application complex hai, aur different parts ki scaling needs alag-alag hain.
Early-stage products jinka domain abhi evolve ho raha hai, unke liye microservices adopt karna — monolith ki simplicity se zyaada fayda hota hai aise cases mein.
System design, organization ki communication structure ko reflect karta hai — team structure, microservices boundaries decide karne ko influence karta hai.
Software design ka ek approach jo business domain ko model karta hai — microservices boundaries decide karne ke liye popular hai.
DDD ka ek key concept — developers aur business experts SAME terminology use karte hain, miscommunication avoid karne ke liye.
Ek explicit boundary hai jiske andar ek domain model valid hai — same term (jaise "Product") alag contexts mein alag meaning rakh sakta hai.
Ek service, ek specific business function (jaise "order management") ko represent karti hai.
Ek gradual migration strategy — ek monolith ko ek saath rewrite karne ke bajaye, ek-ek karke features ko nayi microservices mein move kiya jaata hai.
Services itni chhoti ban jaati hain ki har simple operation ke liye multiple network calls chahiye hote hain — overhead, benefit se zyaada ho jaata hai.
Ek useful heuristic — agar ek team ko feed karne ke liye do se zyaada pizzas chahiye, team (aur shaayad service) bahut badi hai.
Agar do services hamesha ek saath deploy/change hoti hain — microservices ki complexity ke saath monolith ki coupling.
Caller, response ka wait karta hai — REST aur gRPC do popular protocols hain.
"Tight coupling" create karta hai — agar ek downstream service down hai, caller bhi fail ho sakta hai (cascading failures).
Sender, response ka wait nahi karta — message queues (RabbitMQ) ya pub-sub systems (Kafka) messages ko decoupled tareeke se deliver karte hain.
Agar ek downstream service down hai, message queue mein wait karta rehta hai jab tak service wapas up na ho.
REST, HTTP/1.1 aur JSON use karta hai (human-readable). gRPC, HTTP/2 aur Protocol Buffers use karta hai (faster, smaller payloads).
Internal service-to-service communication ke liye — jaha performance matter karta hai.
Services, events (jaise "OrderPlaced") ko publish karti hain, aur dusri services inko subscribe karke react karti hain — directly call kiye bina.
Ek request ka flow, multiple services mein "scattered" ho jaata hai — distributed tracing essential ban jaata hai.
Ek single entry point hai saare client requests ke liye — requests ko appropriate microservices tak route karta hai.
Authentication, rate limiting, aur logging jaisi cheezein centrally handle karta hai — har service mein duplicate karne ki zaroorat nahi.
Ek "registry" hai jo track karta hai ki services kaha hain — service instances registry mein khud ko register karte hain.
Client-side mein, client khud registry se query karta hai. Server-side mein, ek load balancer ye kaam karta hai.
Har request ko agle instance par turn-by-turn route karta hai.
Unhealthy instances ko automatically rotation se hataने ke liye — jab tak woh wapas healthy na ho jaayein.
Har client type (web, mobile) ke liye ek separate tailored API layer — multiple backend services ko aggregate karta hai.
Har team apni BFF independently evolve kar sakti hai, bina dusri teams ko coordinate kiye.
Har microservice apna exclusive database rakhti hai — koi dusri service directly access nahi kar sakti, sirf API se.
Multiple services ek hi database use karti hain — schema changes multiple services ko affect karte hain, loose coupling khatam ho jaata hai.
Ek distributed transaction ko local transactions ki series mein break karta hai — har step ka ek "compensating" action hota hai agar koi baad ka step fail ho jaaye.
Choreography mein, har service events ko listen karke apna kaam karti hai. Orchestration mein, ek central "orchestrator" har step ko coordinate karta hai.
Command Query Responsibility Segregation — write operations ko read operations se separate karta hai, har ek apna alag data model use kar sakta hai.
Write model, data integrity par optimized hota hai (normalized). Read model, query speed par optimized hota hai (denormalized).
Ek entity ka current state store karne ke bajaye, uspar hue saare changes (events) store kiye jaate hain — current state, events ko replay karke derive ki jaati hai.
Ek complete audit log deta hai — har change ki history always available hai.
Ye blocking hai — agar coordinator crash ho jaaye, participants indefinitely locked reh sakte hain.
Ek downstream service ki calls ko monitor karta hai — agar failure rate ek threshold se zyaada ho jaata hai, circuit "opens" ho jaata hai, further calls immediately fail ho jaati hain.
Closed (normal operation), Open (failing fast), Half-Open (testing recovery).
Retry logic mein, har retry ke beech wait time badhana — taaki ek struggling service par more load na pade.
Ek slow downstream service, poore system ko indefinitely "hang" na kar de.
Resources (jaise thread pools) ko isolate karta hai — ek slow ya failing downstream service, dusri calls ke pools ko exhaust nahi kar sakta.
Ek non-critical dependency fail hone par, poora page crash nahi hota — sirf woh specific feature hide ho jaata hai ya ek fallback dikhta hai.
Nahi — sirf TRANSIENT errors (jaise 503, timeouts) ko retry karna chahiye, "400 Bad Request" jaise errors ko nahi.
Har service ko uski dependencies ke saath ek container mein package karta hai — "it works on my machine" problem solve karta hai.
Ek container orchestration platform hai — containers ki deployment, scaling, aur management ko automate karta hai multiple machines ke across.
Smallest deployable unit — ek ya more containers.
Pod ko ek stable network address deta hai.
Ek dedicated infrastructure layer jo service-to-service communication ko handle karta hai — "sidecar" proxies automatically retries, encryption, aur observability handle karte hain.
Zero-downtime deployment — instances ek-ek karke replace hote hain, poori service kabhi rukti nahi.
CPU/memory usage ke basis par, automatically instances ki count adjust karta hai.
Ek unique "trace ID" har request ko assign karta hai — har service jo request handle karti hai, ek "span" add karti hai.
Jaeger, Zipkin, aur AWS X-Ray — traces ko visualize karte hain, bottlenecks pinpoint karne ke liye.
Saare services ke logs ko ek searchable platform mein aggregate karta hai — ELK Stack (Elasticsearch, Logstash, Kibana) popular toolset hai.
JSON format mein logs, jinme trace IDs aur consistent fields hote hain — centralized systems mein effectively query karne ke liye essential.
Latency, Traffic, Errors, aur Saturation — Google's SRE book se aaya, microservices monitoring ke liye widely-adopted starting point.
Prometheus, metrics collect/store karta hai. Grafana, visualization dashboards deta hai — MICROSERVICES monitoring ka popular combination.
Liveness probe check karta hai ki service "alive" hai ya nahi (fail par restart). Readiness probe check karta hai ki service traffic handle karne ke liye ready hai ya nahi.
Har service-to-service call bhi authenticate/authorize ki jaati hai, chahe woh internal network mein hi kyun na ho.
Dono parties (client aur server dono services) ko ek dusre ko certificates se verify karne deta hai — har service-to-service call encrypted aur authenticated hoti hai.
Ek service ko deploy karna, dusri services ko affect nahi karta — "independent deployability" ka key benefit hai.
Verify karta hai ki ek service ke API changes uske consumers ko break nahi karte, poora integration environment spin up kiye bina.
Do identical environments (blue aur green) hote hain — ek live hai, dusra naye version ke saath ready hai — traffic instantly switch kiya jaata hai.
Naya version gradually ek small percentage of traffic (jaise 5%) ko milta hai — agar metrics healthy hain, traffic gradually badhaya jaata hai.
Ek service apna API evolve kar sakti hai bina existing clients ko break kiye.
Different services, different database technologies use karti hain unki specific needs ke hisaab se — jaise search ke liye Elasticsearch, transactions ke liye PostgreSQL.
Bina jitter ke, multiple clients same time par retry kar sakte hain — ek "thundering herd" create karte hue.
High-traffic systems mein, sirf ek percentage requests ko trace karta hai (jaise 1%) — overhead manage karne ke liye, errors ko hamesha 100% trace kiya jaata hai.
Same "key" (jaise same user ID) hamesha same instance par route hoti hai — WebSocket connections jaise use-cases ke liye useful.
Backward-compatible changes (jaise naye optional fields) — schema registry tools compatibility ko enforce karne mein help karte hain.
Rolling updates ya node maintenance ke dauran, ek minimum number of pods hamesha available rehte hain.
Clients ko batata hai ki ek API version kab deprecated ho jaayegi — proactive migration ke liye.
Ek hybrid approach — single deployable unit (monolith ki tarah) lekin internally well-defined module boundaries ke saath.
DDD mein, ek entity jo related objects ke ek cluster ke liye entry point hai — jaise ek Order aggregate root, jisme OrderItems included hain.
Kyunki retries (network failures ki wajah se) ek hi step ko multiple baar trigger kar sakte hain — same result hona chahiye.
Layer 4 (TCP-level) faster hai lekin less smart. Layer 7 (HTTP-level) HTTP headers/paths ke hisaab se intelligent routing kar sakta hai.
Resilience4j (Java), Polly (.NET), aur opossum (Node.js) — ready-made implementations dete hain.