ååãSpring CacheãæŽ»çšããŠã¢ããªã±ãŒã·ã§ã³ã®æ§èœãåäžãããæ¹æ³ãåŠã³ãŸããã
ããããã¯ãã·ã¹ãã ã®é«åºŠãªèšèšã«é¢ãããããã¯ã«é²ã¿ãŸããå€§èŠæš¡ãªã·ã¹ãã ããã€ã¯ããµãŒãã¹ã§ã¯ãã³ã³ããŒãã³ãéã®**çµå床ïŒCouplingïŒ**ãäžããççµåã«ããããšãéèŠã§ããããã«ãããäžéšã®æ©èœå€æŽãä»ã®æ©èœã«åœ±é¿ãäžãããªã¹ã¯ãæžãããã·ã¹ãã ã®æ¡åŒµæ§ïŒã¹ã±ãŒã©ããªãã£ïŒãšä¿å®æ§ãé«ããŸãã
ä»åã¯ãã·ã¹ãã ãççµåã«ããããã®åŒ·åãªèšèšãã¿ãŒã³ã§ãã ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDA: Event-Driven ArchitectureïŒ ã®åºæ¬ãšãSpring Bootã§ã®å®è£ æ¹æ³ãåŠã³ãŸãã
1. ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒãšã¯ïŒ
åŸæ¥ã®ã·ã¹ãã ã¯ããããµãŒãã¹ïŒAïŒãå¥ã®ãµãŒãã¹ïŒBïŒãçŽæ¥åŒã³åºãïŒäŸïŒã¡ãœããåŒã³åºããHTTPãªã¯ãšã¹ãïŒããšã§åŠçã飿ºããŠããŸãããããã¯åæçãªé£æºã§ãããAã¯Bã®å¿çãåŸ ã€å¿ èŠããããŸãã
ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã§ã¯ãã³ã³ããŒãã³ãéã®çŽæ¥çãªåŒã³åºããé¿ãã代ããã«**ã€ãã³ãïŒåºæ¥äºïŒ**ãä»ããŠéæ¥çã«é£æºããŸãã
- ã€ãã³ã: ã·ã¹ãã å ã§ãäœããèµ·ãã£ãããšããäºå®ãäŒããã¡ãã»ãŒãžïŒäŸïŒã泚æãå®äºãããããŠãŒã¶ãŒãç»é²ããããïŒã
- ãããªãã·ã£ãŒïŒçºè¡è ïŒ: ã€ãã³ããçºçãããéç¥ããã³ã³ããŒãã³ãã
- ãµãã¹ã¯ã©ã€ããŒïŒè³Œèªè ïŒ: ã€ãã³ããåä¿¡ããããã«å¿ããåŠçãå®è¡ããã³ã³ããŒãã³ãã
1-1. ççµåã®ã¡ãªãã
ãããªãã·ã£ãŒã¯ãèªåã®ã€ãã³ãã誰ãåãåããïŒãµãã¹ã¯ã©ã€ããŒïŒãäžåç¥ããŸããããµãã¹ã¯ã©ã€ããŒããã€ãã³ããã©ãããæ¥ãããç¥ãå¿ èŠã¯ãããŸããã
ããã«ãããæ°ãããµãã¹ã¯ã©ã€ããŒã远å ããŠããæ¢åã®ãããªãã·ã£ãŒã®ã³ãŒãã倿Žããå¿ èŠããªããé«ãççµåæ§ãå®çŸããŸãã
2. Spring Frameworkã«ãããã€ãã³ãã®å®è£
Spring Frameworkã§ã¯ãã€ãã³ãé§åãå®çŸããããã®ä»çµã¿ãæšæºã§æäŸããŠããŸãã
2-1. ã¢ããªã±ãŒã·ã§ã³ã€ãã³ãïŒApplication EventsïŒ
Springã®ã³ã³ããŒãã³ãå ã§ãåãDIã³ã³ããå ã«ããã³ã³ããŒãã³ããžã€ãã³ããéç¥ããå Žåãã¢ããªã±ãŒã·ã§ã³ã€ãã³ãã䜿ããŸããããã¯ããã€ã¯ããµãŒãã¹éã®é£æºãšãããããåäžã®Springã¢ããªã±ãŒã·ã§ã³å ã®ãµãŒãã¹ãã³ã³ããŒãã³ãéã®ççµåã«äœ¿ãããŸãã
2-2. ã€ãã³ãã®å®çŸ©ïŒããŒã¿ïŒ
ã€ãã³ãã¯ããäœãèµ·ãã£ããããšããæ å ±ãæã€éåžžã®Javaã¯ã©ã¹ãšããŠå®çŸ©ããŸãã
Java
public class OrderCompletedEvent {
private final Long orderId;
private final String customerEmail;
// ã³ã³ã¹ãã©ã¯ã¿ãã²ãã¿ãŒ
public OrderCompletedEvent(Long orderId, String customerEmail) {
this.orderId = orderId;
this.customerEmail = customerEmail;
}
// ...
}
2-3. ã€ãã³ãã®å®è¡ïŒãããªãã·ã£ãŒïŒ
ã€ãã³ããçºè¡ããããã«ã¯ãApplicationEventPublisher ã€ã³ã¿ãŒãã§ãŒã¹ãDIã§åãåãããã® publishEvent ã¡ãœãããåŒã³åºããŸãã
Java
import org.springframework.context.ApplicationEventPublisher;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class OrderService {
private final ApplicationEventPublisher eventPublisher;
public void completeOrder(Long orderId, String email) {
// 1. 泚æDBåŠçãªã©ãå®è¡
// ...
System.out.println("泚æåŠçãå®äºããŸãããã€ãã³ããçºè¡ããŸãã");
// 2. ã€ãã³ãã®çºè¡
OrderCompletedEvent event = new OrderCompletedEvent(orderId, email);
eventPublisher.publishEvent(event);
// 3. åŒã³åºãå
ã¯ããã«åŠçãçµãã
}
}
2-4. ã€ãã³ãã®è³ŒèªïŒãµãã¹ã¯ã©ã€ããŒïŒ
ã€ãã³ããåãåãã³ã³ããŒãã³ãïŒãµãã¹ã¯ã©ã€ããŒïŒã¯ãã¡ãœããã« @EventListener ã¢ãããŒã·ã§ã³ãä»äžããã ãã§ãç¹å®ã®ã€ãã³ãã¿ã€ãã賌èªã§ããŸãã
Java
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class EmailNotificationService {
// OrderCompletedEventãçºè¡ããããšããã®ã¡ãœãããèªåã§åŒã³åºããã
@EventListener
public void handleOrderCompleted(OrderCompletedEvent event) {
System.out.println("ãã¡ãŒã«ãµãŒãã¹ãã€ãã³ããåä¿¡ããŸãããæ³šæID: " + event.getOrderId());
// 泚æå®äºã¡ãŒã«éä¿¡åŠçãå®è¡
}
}
3. åæçãªå®è¡ãšéåæçãªå®è¡
Springã® @EventListener ã¡ãœããã¯ãããã©ã«ãã§ã¯ã€ãã³ããçºè¡ããã¹ã¬ãããš**åãã¹ã¬ããïŒåæïŒ**ã§å®è¡ãããŸããããã¯ãã€ãã³ãã®åŠçäžã«äŸå€ãçºçããå Žåããããªãã·ã£ãŒã®åŠçãŸã§åœ±é¿ãåã¶å¯èœæ§ããããŸãã
ãã®åé¡ã解決ããçã®ççµåæ§ãé«ããããã«ã¯ãã€ãã³ãåŠçãéåæã«ããå¿ èŠããããŸãã
- éåæå: ã€ãã³ããåŠçããã¡ãœããã«ã第31åã§åŠãã
@Asyncã¢ãããŒã·ã§ã³ã䜵çšããŸãã
Java
import org.springframework.scheduling.annotation.Async;
@Service
public class InventoryUpdateService {
@Async // å¥ã¹ã¬ããã§å®è¡
@EventListener
public void updateInventory(OrderCompletedEvent event) {
System.out.println("ãåšåº«ãµãŒãã¹ãåšåº«æŽæ°ãéåæã§éå§ããŸãã");
// ... åšåº«æŽæ°ã®ããžãã¯
}
}
@Async ã䜿ãããšã§ãOrderService ã¯ã€ãã³ããçºè¡ãããããã«åŠçãçµããã¡ãŒã«éä¿¡ãåšåº«æŽæ°ãšãã£ããµãã¹ã¯ã©ã€ããŒã®åŠçãåŸ
ããã«æžã¿ãŸãã
4. ãŸãšãïŒççµåã«ããæè»æ§
ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒã¯ãã³ã³ããŒãã³ãéã®äŸåé¢ä¿ãæã¡åããã·ã¹ãã ã«é«ãæè»æ§ããããããŸããSpringã®ã¢ããªã±ãŒã·ã§ã³ã€ãã³ãã¯ãç¹ã«åãã¢ããªã±ãŒã·ã§ã³å ã§ã®æ¥ååŠçã®é£æºã«ãããŠãã¯ãªãŒã³ã§æ¡åŒµæ§ã®é«ãã³ãŒããå®çŸããããã®åŒ·åãªææ®µã§ãã
â æ¬æ¥ã®ãŸãšã
- **ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒ**ã¯ãã³ã³ããŒãã³ãéã®çŽæ¥åŒã³åºããé¿ããã€ãã³ããä»ããŠéæ¥çã«é£æºããççµåãå®çŸããã
- ã€ãã³ãã¯ã
ApplicationEventPublisherã® publishEvent ã¡ãœããã§**çºè¡ïŒãããªãã·ã¥ïŒ**ããã - ã€ãã³ãã®è³Œèªè
ïŒãµãã¹ã¯ã©ã€ããŒïŒã¯ãã¡ãœããã«
@EventListenerãä»äžããã ãã§ãç¹å®ã®ã€ãã³ãã¿ã€ããåãåããã - ã€ãã³ãåŠçã®çã®ççµåïŒåé¢ïŒãšæ§èœåäžã®ãããã€ãã³ããªã¹ããŒã¡ãœããã«ã¯
@Asyncã䜵çšããéåæã§å®è¡ããããšãæšå¥šãããã
ð æ¬¡åäºå
ä»ååŠãã ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã¯ãäžã€ã®Springã¢ããªã±ãŒã·ã§ã³å ã§ã®è©±ã§ããã
次åã¯ãè€æ°ã®ç°ãªãã¢ããªã±ãŒã·ã§ã³ïŒãã€ã¯ããµãŒãã¹ãªã©ïŒãå€éšã·ã¹ãã ãšã®éã§ã€ãã³ããããåãããããã®ãããå€§èŠæš¡ãªä»çµã¿ã§ãã**ã¡ãã»ãŒãžãã¥ãŒïŒKafka/RabbitMQïŒ**ã®åºæ¬æŠå¿µãšãSpring Bootããã®é£æºæ¹æ³ã®æŠèŠãåŠã³ãŸãã
次åïŒã第47åããã€ã¯ããµãŒãã¹é£æºã®èŠïŒãã¡ãã»ãŒãžãã¥ãŒãšSpring Cloud Streamã®åºæ¬ã ã«ãæåŸ ãã ããïŒ


ã³ã¡ã³ã