Server-Sent EventsïŒSSEïŒã®åãæ¢æ±ãããªã¢ã«ã¿ã€ã ã®ããã³ããšã³ãæŽæ°ãå®çŸãã¹ããªãŒãã³ã°å¿çã®å®è£ ãšåŠçæ¹æ³ãåŠã³ãããåçã§é åçãªãŠãŒã¶ãŒäœéšãæ§ç¯ããŸãããã
ããã³ããšã³ãã®ã¹ããªãŒãã³ã°å¿çïŒServer-Sent Eventsããã¹ã¿ãŒããŠåçãªãŠãŒã¶ãŒäœéšãå®çŸ
仿¥ã®ããŒã¹ã®éãããžã¿ã«ç°å¢ã«ãããŠããŠãŒã¶ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãå¿çæ§ã«åªãããªã¢ã«ã¿ã€ã ã®æŽæ°ãæäŸããããšãæåŸ ããŠããŸããåŸæ¥ã®èŠæ±ã»å¿çã¢ãã«ã¯ãç¶ç¶çãªããŒã¿ã¹ããªãŒã ãé ä¿¡ããç¹ã§ã¯äžååãªå ŽåããããŸããããã§ãçã«åçã§é åçãªãŠãŒã¶ãŒäœéšãåµé ããããšããããã³ããšã³ãéçºè ã«ãšã£ãŠã匷åã§ãããªããèŠéããããã¡ãªæè¡ãšããŠServer-Sent Events (SSE) ãç»å ŽããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãSSEã®åºæ¬ååããé«åºŠãªå®è£ æŠç¥ãŸã§ããã®è€éããæãäžããçãçããšããææ°ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããåãäžããŸãã
Server-Sent Events (SSE) ãçè§£ãã
Server-Sent Events (SSE) ã¯ããµãŒããŒãåäžã®é·å¯¿åœHTTPæ¥ç¶ãä»ããŠã¯ã©ã€ã¢ã³ãã«ããŒã¿ãããã·ã¥ã§ããããã«ãããŠã§ãæè¡ã§ããåæ¹åéä¿¡ãå¯èœã«ããWebSocketãšã¯ç°ãªããSSEã¯ãµãŒããŒããã¯ã©ã€ã¢ã³ããžã®åæ¹åéä¿¡ã®ããã«èšèšãããŠããŸããããã«ãããã¯ã©ã€ã¢ã³ããåžžã«ãµãŒããŒãããŒãªã³ã°ããå¿ èŠãªãããµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã«åæã«æŽæ°ãéç¥ããŸãã¯é²æã¬ããŒãããããŒããã£ã¹ãããå¿ èŠãããã·ããªãªã«æé©ãªéžæè¢ãšãªããŸãã
SSEã®ä»çµã¿
SSEã®æ žãšãªãã®ã¯ãæç¶çãªHTTPæ¥ç¶ã§ããã¯ã©ã€ã¢ã³ããSSEãä»ããŠããŒã¿ãèŠæ±ãããšããµãŒããŒã¯æ¥ç¶ãéãããŸãŸã«ããã€ãã³ããçºçãããã³ã«éä¿¡ããŸãããããã®ã€ãã³ãã¯ããã¬ãŒã³ããã¹ãã®æ¹è¡åºåã圢åŒã§ãã©ãŒããããããŸãããã©ãŠã¶ã®ãã€ãã£ããªEventSource APIãæ¥ç¶ç®¡çãã€ãã³ãè§£æããšã©ãŒåŠçãæ
åœããããã³ããšã³ãéçºè
ã«ãšã£ãŠã®è€éãã®å€ããæœè±¡åããŸãã
SSEã®äž»ãªç¹åŸŽïŒ
- åæ¹åéä¿¡ïŒããŒã¿ã¯ãµãŒããŒããã¯ã©ã€ã¢ã³ãã«ã®ã¿æµããŸãã
- åäžæ¥ç¶ïŒåäžã®é·å¯¿åœHTTPæ¥ç¶ãç¶æãããŸãã
- ããã¹ãããŒã¹ã®ãããã³ã«ïŒã€ãã³ãã¯ãã¬ãŒã³ããã¹ããšããŠéä¿¡ããããããèªã¿ããããããã°ã容æã§ãã
- èªå忥ç¶ïŒæ¥ç¶ã倱ãããå Žåã
EventSourceAPIã¯èªåçã«åæ¥ç¶ã詊ã¿ãŸãã - HTTPããŒã¹ïŒSSEã¯æ¢åã®HTTPã€ã³ãã©ã¹ãã©ã¯ãã£ã掻çšããããããããã€ããã¡ã€ã¢ãŠã©ãŒã«ã®ééãç°¡çŽ åãããŸãã
- ã€ãã³ãã¿ã€ãïŒã«ã¹ã¿ã ã®`event`ãã£ãŒã«ãã§ã€ãã³ããåé¡ã§ããã¯ã©ã€ã¢ã³ããããŸããŸãªçš®é¡ã®æŽæ°ãåºå¥ã§ããŸãã
ãªãããã³ããšã³ãã¹ããªãŒãã³ã°ã«SSEãéžã¶ã®ãïŒ
WebSocketã¯å šäºééä¿¡ãæäŸããŸãããSSEã¯ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãç¹ã«ãµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ããŒã¿ããã·ã¥ãäž»ãªèŠä»¶ã§ããå Žåã«ã説åŸåã®ããå©ç¹ãæäŸããŸãããããã®å©ç¹ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
1. ã·ã³ãã«ããšå®è£ ã®å®¹æã
WebSocketãšæ¯èŒããŠãSSEã¯ãµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã®äž¡æ¹ã§å®è£
ã倧å¹
ã«ã·ã³ãã«ã§ããææ°ã®ãã©ãŠã¶ã«æèŒãããŠããEventSource APIããæ¥ç¶ç®¡çãã¡ãã»ãŒãžè§£æããšã©ãŒåŠçãªã©ã倧éšåã®é¢åãªäœæ¥ãåŠçããŠãããŸããããã«ãããéçºæéãšè€éãã軜æžãããŸãã
2. çµã¿èŸŒã¿ã®åæ¥ç¶ãšãšã©ãŒåŠç
EventSource APIã¯ãæ¥ç¶ãäžæãããå Žåã«èªåçã«åæ¥ç¶ã詊ã¿ãŸãããã®çµã¿èŸŒã¿ã®å
ç¢æ§ã¯ãç¹ã«äžå®å®ãªãããã¯ãŒã¯ç°å¢ã«ãããŠãã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒäœéšãç¶æããããã«äžå¯æ¬ ã§ãã忥ç¶ééãèšå®ã§ãã忥ç¶ã®æåãå¶åŸ¡ã§ããŸãã
3. å¹ççãªãªãœãŒã¹äœ¿çš
åæ¹åéä¿¡ãå¿ èŠãšããªãã·ããªãªã§ã¯ãSSEã¯WebSocketããããªãœãŒã¹å¹çãè¯ãã§ããæšæºã®HTTPãå©çšãããããç¹å¥ãªèšå®ãå¿ èŠãšããã«ããããã·ãããŒããã©ã³ãµãŒãªã©ã®æ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ååã«ãµããŒããããŠããŸãã
4. ãã©ãŠã¶ãšãããã¯ãŒã¯ã®äºææ§
SSEã¯HTTPäžã«æ§ç¯ãããŠãããææ°ã®ãã©ãŠã¶ã§åºããµããŒããããŠããŸããæšæºã®HTTPãããã³ã«ã«äŸåããŠãããããç¹å¥ãªèšå®ãå¿ èŠãªå ŽåãããWebSocketæ¥ç¶ããããäžè¬çã«ãã¡ã€ã¢ãŠã©ãŒã«ããããã¯ãŒã¯äžéè£ çœ®ãã¹ã ãŒãºã«ééããŸãã
Server-Sent Eventsã®å®è£ ïŒå®è·µã¬ã€ã
SSE察å¿ã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«ã¯ãããã¯ãšã³ããšããã³ããšã³ãã®äž¡æ¹ã®éçºãå«ãŸããŸããå®è£ ããã»ã¹ãåè§£ããŠã¿ãŸãããã
ããã¯ãšã³ãå®è£ ïŒSSEã®éä¿¡
ãµãŒããŒã®åœ¹å²ã¯ãHTTPæ¥ç¶ã確ç«ããSSE圢åŒã§ã€ãã³ããéä¿¡ããããšã§ããå ·äœçãªå®è£ ã¯ããã¯ãšã³ãã®èšèªããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠç°ãªããŸãããåºæ¬çãªååã¯åãã§ãã
SSEã€ãã³ã圢åŒ
Server-Sent Eventsã¯ãç¹å®ã®åºåãæåãæã€ãã¬ãŒã³ããã¹ããšããŠãã©ãŒããããããŸããåã€ãã³ãã¯ãæ¹è¡æåïŒ` `ïŒã§çµãã1è¡ä»¥äžã®è¡ã§æ§æãããŸããäž»èŠãªãã£ãŒã«ãã¯æ¬¡ã®ãšããã§ãïŒ
data:å®éã®ããŒã¿ãã€ããŒããè€æ°ã®data:è¡ã¯ãã¯ã©ã€ã¢ã³ãåŽã§æ¹è¡æåãæãã§é£çµãããŸããevent:ã€ãã³ãã®çš®é¡ãå®çŸ©ãããªãã·ã§ã³ã®æååãããã«ãããã¯ã©ã€ã¢ã³ãã¯ã€ãã³ãã¿ã€ãã«åºã¥ããŠç°ãªããã³ãã©ã«ãã£ã¹ãããã§ããŸããid:æåŸã«èªèãããã€ãã³ãIDã衚ããªãã·ã§ã³ã®æååãã¯ã©ã€ã¢ã³ãã¯åæ¥ç¶æã«ããã`Last-Event-ID`ããããŒã§éãè¿ãããšãã§ãããµãŒããŒã¯äžæãããšããããã¹ããªãŒã ãåéã§ããŸããretry:åæ¥ç¶æéãããªç§åäœã§è¡šããªãã·ã§ã³ã®æååã
空è¡ã¯ã€ãã³ãã®çµäºãæå³ããŸããã³ãã³ïŒ`:`ïŒã§å§ãŸãè¡ã¯ã³ã¡ã³ãè¡ã§ãã
äŸïŒæŠå¿µçãªNode.jsãšExpressïŒïŒ
```javascript app.get('/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); let eventCounter = 0; const intervalId = setInterval(() => { const message = { event: 'update', id: eventCounter, data: JSON.stringify({ timestamp: new Date().toISOString(), message: `Server tick ${eventCounter}` }) }; res.write(`event: ${message.event}\n`); res.write(`id: ${message.id}\n`); res.write(`data: ${message.data}\n\n`); eventCounter++; if (eventCounter > 10) { // Example: stop after 10 events clearInterval(intervalId); res.end(); } }, 1000); req.on('close', () => { clearInterval(intervalId); res.end(); }); }); ```
ãã®äŸã§ã¯ïŒ
- é©åãªããããŒãèšå®ããŠããŸãïŒ
Content-Type: text/event-streamãCache-Control: no-cacheãConnection: keep-aliveã setIntervalã䜿çšããŠå®æçã«ã€ãã³ããéä¿¡ããŠããŸãã- åã€ãã³ãã¯
eventãidãdataãã£ãŒã«ãã§ãã©ãŒããããããã€ãã³ãã®çµäºã瀺ãããã«ç©ºè¡ãç¶ããŸãã - ã¯ã©ã€ã¢ã³ãã®åæãåŠçããããã«ãã€ã³ã¿ãŒãã«ãã¯ãªã¢ããŠããŸãã
ããã³ããšã³ãå®è£ ïŒSSEã®åä¿¡
ããã³ããšã³ãã§ã¯ãEventSource APIã䜿çšããããšã§ãSSEã¹ããªãŒã ãžã®æ¥ç¶ãšåä¿¡ã€ãã³ãã®åŠçãéåžžã«ç°¡åã«ãªããŸãã
EventSource APIã®äœ¿çš
```javascript const eventSource = new EventSource('/events'); // Handle general 'message' events (when no 'event' field is specified) eventSource.onmessage = (event) => { console.log('Received generic message:', event.data); // Process event.data here const parsedData = JSON.parse(event.data); // Update UI with parsedData.message and parsedData.timestamp }; // Handle custom 'update' events eventSource.addEventListener('update', (event) => { console.log('Received update event:', event.data); const parsedData = JSON.parse(event.data); // Update UI with parsedData.message and parsedData.timestamp document.getElementById('status').innerText = `Last update: ${parsedData.message} at ${parsedData.timestamp}`; }); // Handle connection errors eventSource.onerror = (error) => { console.error('EventSource failed:', error); // Optionally, display a user-friendly error message or retry mechanism eventSource.close(); // Close the connection on error if not automatically handled }; // Handle connection opening eventSource.onopen = () => { console.log('EventSource connection opened.'); }; // Optional: Close the connection when it's no longer needed // document.getElementById('stopButton').addEventListener('click', () => { // eventSource.close(); // console.log('EventSource connection closed.'); // }); ```
ãã®ããã³ããšã³ãã®äŸã§ã¯ïŒ
- ããã¯ãšã³ãã®ãšã³ããã€ã³ããæã
EventSourceã€ã³ã¹ã¿ã³ã¹ãäœæããŠããŸãã onmessageã¯ãeventã¿ã€ããæå®ãããŠããªãã€ãã³ãã®ããã©ã«ããã³ãã©ã§ããaddEventListener('custom-event-name', handler)ã䜿çšãããšããµãŒããŒããéä¿¡ãããç¹å®ã®ã€ãã³ãã¿ã€ãã賌èªã§ããŸããonerrorã¯ãæ¥ç¶ã®å€±æããããã¯ãŒã¯ã®åé¡ãåŠçããããã«éèŠã§ããonopenã¯ãæ¥ç¶ãæ£åžžã«ç¢ºç«ããããšãã«åŒã³åºãããŸããeventSource.close()ã䜿çšããŠæ¥ç¶ãçµäºã§ããŸãã
é«åºŠãªSSEãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹
SSEã广çã«æŽ»çšããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ã¯ããããã®é«åºŠãªãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
1. ã€ãã³ãIDãšåæ¥ç¶
ãµãŒããŒã§ã€ãã³ãIDãå®è£ ããã¯ã©ã€ã¢ã³ãã§`Last-Event-ID`ããããŒãåŠçããããšã¯ãå埩åã®ããã«äžå¯æ¬ ã§ããæ¥ç¶ãåæããããšããã©ãŠã¶ã¯èªåçã«åæ¥ç¶ã詊ã¿ãåä¿¡ãã`Last-Event-ID`ãå«ããŸãããµãŒããŒã¯ãã®IDã䜿çšããŠèŠéããã€ãã³ããåéä¿¡ã§ããããŒã¿ã®ç¶ç¶æ§ã確ä¿ã§ããŸãã
ããã¯ãšã³ãïŒæŠå¿µïŒïŒ
```javascript // When sending events: res.write(`id: ${eventCounter}\n`); // When receiving a reconnect request: const lastEventId = req.headers['last-event-id']; if (lastEventId) { console.log(`Client reconnected with last event ID: ${lastEventId}`); // Logic to send missed events starting from lastEventId } ```
2. ã«ã¹ã¿ã ã€ãã³ãã¿ã€ã
eventãã£ãŒã«ãã䜿çšãããšãåãSSEæ¥ç¶ãä»ããŠç°ãªãçš®é¡ã®ããŒã¿ãéä¿¡ã§ããŸããäŸãã°ãuser_updateã€ãã³ããnotificationã€ãã³ããprogress_updateã€ãã³ããªã©ãéä¿¡ã§ããŸããããã«ãããããã³ããšã³ãã®ããžãã¯ãããæŽçãããã¯ã©ã€ã¢ã³ããç¹å®ã®ã€ãã³ãã«åå¿ã§ããããã«ãªããŸãã
3. ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³
SSEã¯ããã¹ãããŒã¹ã§ãããJSONãªã©ã®æ§é åããŒã¿ãéä¿¡ããã®ãäžè¬çã§ãããµãŒããŒãããŒã¿ãæ£ããã·ãªã¢ã©ã€ãºïŒäŸïŒJSON.stringifyã䜿çšïŒããã¯ã©ã€ã¢ã³ããããããã·ãªã¢ã©ã€ãºïŒäŸïŒJSON.parseã䜿çšïŒããããšã確èªããŠãã ããã
ããã¯ãšã³ãïŒ
```javascript res.write(`data: ${JSON.stringify({ type: 'status', payload: 'Processing completed' })}\n\n`); ```
ããã³ããšã³ãïŒ
```javascript eventSource.addEventListener('message', (event) => { const data = JSON.parse(event.data); if (data.type === 'status') { console.log('Status update:', data.payload); } }); ```
4. è€æ°ã®SSEã¹ããªãŒã ã®åŠç
åäžã®EventSourceã€ã³ã¹ã¿ã³ã¹ã¯1ã€ã®URLã«ããæ¥ç¶ã§ããŸãããè€æ°ã®ç°ãªãã¹ããªãŒã ããªãã¹ã³ããå¿
èŠãããå Žåã¯ããããããç°ãªããšã³ããã€ã³ããæãè€æ°ã®EventSourceã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠããããŸãã
5. ãµãŒããŒè² è·ãšæ¥ç¶å¶é
SSEã¯é·å¯¿åœã®HTTPæ¥ç¶ã䜿çšããŸãããµãŒããŒã®ãªãœãŒã¹å¶éããWebãµãŒããŒãŸãã¯ããŒããã©ã³ãµãŒã«ãã£ãŠèª²ãããå¯èœæ§ã®ããæ¥ç¶å¶éã«æ³šæããŠãã ãããã€ã³ãã©ã¹ãã©ã¯ãã£ãååãªæ°ã®åææ¥ç¶ãåŠçã§ããããã«èšå®ãããŠããããšã確èªããŠãã ããã
6. ã°ã¬ãŒã¹ãã«ã·ã£ããããŠã³ãšã¯ãªãŒã³ã¢ãã
ãµãŒããŒãã·ã£ããããŠã³ãããšããã¯ã©ã€ã¢ã³ããåæãããšãã¯ãéããŠããæ¥ç¶ãéããããã€ã³ã¿ãŒãã«ãã¯ãªã¢ããããããªã©ããªãœãŒã¹ãé©åã«ã¯ãªãŒã³ã¢ããããããšãäžå¯æ¬ ã§ããããã«ããããªãœãŒã¹ãªãŒã¯ãé²ããã¹ã ãŒãºãªç§»è¡ãä¿èšŒããŸãã
7. ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
SSEã¯HTTPäžã«æ§ç¯ãããŠãããããHTTPã®ã»ãã¥ãªãã£æ©èœãç¶æ¿ããŸãã転éäžã®ããŒã¿ãæå·åããããã«ãæ¥ç¶ãHTTPSã§æäŸãããããã«ããŠãã ãããèªèšŒã«ã€ããŠã¯ãSSEæ¥ç¶ã確ç«ããéã«æšæºçãªHTTPèªèšŒã¡ã«ããºã ïŒäŸïŒããããŒå ã®ããŒã¯ã³ïŒã䜿çšã§ããŸãã
Server-Sent Eventsã®ãŠãŒã¹ã±ãŒã¹
SSEã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãããããŸããŸãªãªã¢ã«ã¿ã€ã æ©èœã«ãšã£ãŠçæ³çãªãœãªã¥ãŒã·ã§ã³ã§ãã以äžã«ããã€ãã®äž»èŠãªãŠãŒã¹ã±ãŒã¹ã瀺ããŸãïŒ
1. ã©ã€ãéç¥ãšã¢ã©ãŒã
æ°ããã¡ãã»ãŒãžãåéãªã¯ãšã¹ããã·ã¹ãã ã¢ããããŒããªã©ãé¢é£ããã¢ã¯ãã£ããã£ã«ã€ããŠãããŒãžãæŽæ°ããããšãªããŠãŒã¶ãŒã«å³åº§ã«éç¥ãé ä¿¡ããŸããäŸãã°ããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã¯SSEã䜿çšããŠæ°ããæçš¿ã®éç¥ããã€ã¬ã¯ãã¡ãã»ãŒãžãããã·ã¥ã§ããŸãã
ã°ããŒãã«ãªäŸïŒã·ã³ã¬ããŒã«ã®éè¡ã¢ããªã±ãŒã·ã§ã³ã¯ãSSEã䜿çšããŠãå€é¡ã®åŒãåºããé éãªã©ã®å£åº§æŽ»åã«ã€ããŠãŠãŒã¶ãŒã«ãªã¢ã«ã¿ã€ã ã§èŠåããéèååŒã®å³æèªèãä¿èšŒããããšãã§ããŸãã
2. ãªã¢ã«ã¿ã€ã ããŒã¿ãã£ãŒã
æ ªäŸ¡ãã¹ããŒãã®ã¹ã³ã¢ãæå·é貚ã®ã¬ãŒããªã©ãé »ç¹ã«å€åããã©ã€ãããŒã¿ã衚瀺ããŸããSSEã¯ããããã®ãã£ãŒãã«æŽæ°ãçºçãããšããã«ããã·ã¥ãããŠãŒã¶ãŒã«ææ°æ å ±ãæäŸãç¶ããŸãã
ã°ããŒãã«ãªäŸïŒãã³ãã³ã«æ ç¹ã眮ãã°ããŒãã«ãªéèãã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒã¯ãSSEã䜿çšããŠãã¥ãŒãšãŒã¯ãæ±äº¬ããã©ã³ã¯ãã«ãã®ååŒæããã®ã©ã€ãæ ªåŒåžå Žã®æŽæ°ãã¹ããªãŒãã³ã°ããäžçäžã®ãŠãŒã¶ãŒã«ç¬æã®åžå ŽããŒã¿ãæäŸããããšãã§ããŸãã
3. 鲿ã€ã³ãžã±ãŒã¿ãŒãšã¹ããŒã¿ã¹æŽæ°
ãµãŒããŒã§é·æéå®è¡ãããæäœïŒäŸïŒãã¡ã€ã«ã®ã¢ããããŒããã¬ããŒãã®çæãããŒã¿åŠçïŒãå®è¡ããéã«ãSSEã¯ã¯ã©ã€ã¢ã³ãã«ãªã¢ã«ã¿ã€ã ã®é²ææŽæ°ãæäŸã§ããŸããããã«ãããé²è¡äžã®ã¿ã¹ã¯ã®å¯èŠæ§ãäžãããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã
ã°ããŒãã«ãªäŸïŒåœéçã«éå¶ãããŠããã¯ã©ãŠãã¹ãã¬ãŒãžãµãŒãã¹ã¯ãSSEã䜿çšããŠã倧éžããŸãã倧ããªãã¡ã€ã«ã®ã¢ããããŒããããŠã³ããŒãã®é²æç¶æ³ããŠãŒã¶ãŒã«è¡šç€ºããå Žæã«é¢ä¿ãªãäžè²«ããæçãªäœéšãæäŸããããšãã§ããŸãã
4. ã©ã€ããã£ãããšã¡ãã»ãŒãžã³ã°ïŒéå®çãªç¯å²ïŒ
å šäºéã®ãã£ããã«ã¯äžè¬çã«WebSocketã奜ãŸããŸãããSSEã¯ãã£ããã«ãŒã ã§ã¡ãã»ãŒãžãåä¿¡ãããªã©ãããã·ã³ãã«ãªäžæ¹åã®ã¡ãã»ãŒãžã³ã°ã·ããªãªã«äœ¿çšã§ããŸãããŠãŒã¶ãŒãé »ç¹ã«ã¡ãã»ãŒãžãéä¿¡ããã€ã³ã¿ã©ã¯ãã£ããªãã£ããã®å Žåã¯ãçµã¿åãããŸãã¯WebSocketãœãªã¥ãŒã·ã§ã³ãããé©åãããããŸããã
5. ã¢ãã¿ãªã³ã°ãšåæããã·ã¥ããŒã
ã·ã¹ãã ã®å¥å šæ§ãããã©ãŒãã³ã¹ã¡ããªã¯ã¹ããŸãã¯ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ãªã¢ã«ã¿ã€ã ã¢ãã¿ãªã³ã°ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã¯ãSSEã®æ©æµãåããããšãã§ããŸããæ°ããããŒã¿ãã€ã³ããå©çšå¯èœã«ãªããšãããã·ã¥ããŒãã¯åçã«æŽæ°ãããŸãã
ã°ããŒãã«ãªäŸïŒå€åœç±ã®ç©æµäŒç€Ÿã¯ãSSEã䜿çšããŠãç°ãªãã¿ã€ã ãŸãŒã³ãå°åãæšªæãããã©ãã¯ãè¹ã®ãªã¢ã«ã¿ã€ã ã®äœçœ®ãšã¹ããŒã¿ã¹ãããã·ã¥ããŒãã§æŽæ°ããããšãã§ããŸãã
6. å ±åç·šéïŒäžéšïŒ
å ±åäœæ¥ç°å¢ã§ã¯ãSSEã䜿çšããŠãã«ãŒãœã«ã®äœçœ®ãããã¹ãã®æŽæ°ãªã©ãä»ã®ãŠãŒã¶ãŒã«ãã倿Žããã¹ãŠã®æ¥ç¶ã¯ã©ã€ã¢ã³ãã«ãããŒããã£ã¹ãã§ããŸããå®å šãªãªã¢ã«ã¿ã€ã å ±åç·šéã«ã¯ãããæŽç·Žãããã¢ãããŒããå¿ èŠã«ãªãå ŽåããããŸãã
SSE 察 WebSocketïŒé©åãªããŒã«ã®éžæ
ãã€SSEã䜿çšãããã€WebSocketãããé©ããŠããããçè§£ããããšãéèŠã§ããã©ã¡ãã®æè¡ããªã¢ã«ã¿ã€ã éä¿¡ã®ããŒãºã«å¯Ÿå¿ããŸãããããããç°ãªãäž»èŠãªç®çãæãããŸãã
SSEã䜿çšããå ŽåïŒ
- ãµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ãããŒããã£ã¹ãïŒäž»ãªèŠä»¶ããµãŒããŒããã¯ã©ã€ã¢ã³ããžã®æŽæ°éä¿¡ã§ããå Žåã
- ã·ã³ãã«ããéèŠïŒå®è£ ã®å®¹æããšãªãŒããŒãããã®å°ãªããåªå ãããã¢ããªã±ãŒã·ã§ã³ã®å Žåã
- åæ¹åããŒã¿ãããŒïŒã¯ã©ã€ã¢ã³ããåããã£ãã«ãä»ããŠãµãŒããŒã«é »ç¹ã«ã¡ãã»ãŒãžãéä¿¡ããå¿ èŠããªãå Žåã
- æ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®äºææ§ïŒè€éãªèšå®ãªãã§ãã¡ã€ã¢ãŠã©ãŒã«ããããã·ãšã®äºææ§ã確ä¿ããå¿ èŠãããå Žåã
- éç¥ãã©ã€ããã£ãŒããé²ææŽæ°ïŒãŠãŒã¹ã±ãŒã¹ã®ã»ã¯ã·ã§ã³ã§è©³è¿°ããéãã
WebSocketã䜿çšããå ŽåïŒ
- åæ¹åéä¿¡ïŒã¯ã©ã€ã¢ã³ãããµãŒããŒã«é »ç¹ãã€ãªã¢ã«ã¿ã€ã ã§ããŒã¿ãéä¿¡ããå¿ èŠãããå ŽåïŒäŸïŒã€ã³ã¿ã©ã¯ãã£ãã²ãŒã ãå®å šãªãã£ããã¢ããªã±ãŒã·ã§ã³ïŒã
- äž¡æ¹åã§ã®äœé å»¶ïŒéåä¿¡ã®äž¡æ¹ã§å¯èœãªéãäœãé å»¶ãéèŠã§ããå Žåã
- è€éãªç¶æ 管çïŒåçŽãªããŒã¿ããã·ã¥ãè¶ ããè€éãªã¯ã©ã€ã¢ã³ããµãŒããŒéã®çžäºäœçšãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã®å Žåã
SSEã¯ãç¹å®ã®ãªã¢ã«ã¿ã€ã åé¡ã«å¯Ÿããå°éçãªããŒã«ã§ãããã®åé¡ããµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ã¹ããªãŒãã³ã°ã§ããå ŽåãSSEã¯ãã°ãã°ããå¹ççã§ç°¡åãªãœãªã¥ãŒã·ã§ã³ãšãªããŸãã
çµè«
Server-Sent Eventsã¯ããµãŒããŒããããã³ããšã³ããžãªã¢ã«ã¿ã€ã ããŒã¿ãé ä¿¡ããããã®å ç¢ã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããSSEã®ä»çµã¿ãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠå®è£ ããããšã§ãéçºè ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããããŠã§ãã¢ããªã±ãŒã·ã§ã³ãããåçã§ãå¿çæ§ãé«ããé åçãªãã®ã«ããããšãã§ããŸããã©ã€ãããã·ã¥ããŒããéç¥ã·ã¹ãã ãããŒã¿ãã£ãŒãã®ããããæ§ç¯ããŠããå Žåã§ããSSEãæ¡çšããããšã§ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«çã«ã¢ãã³ã§ã€ã³ã¿ã©ã¯ãã£ããªãŠã§ãäœéšãåµé ããåãåŸãããŸãã
仿¥ããSSEã詊ãå§ããçã«ã¹ããªãŒãã³ã°ãããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®å¯èœæ§ãè§£ãæŸã¡ãŸãããïŒ