ãã®èšäºã§ã¯ãã³ãŒãã®ããã¯ãšã³ããšããã³ããšã³ããžã®æšæºçãªå³å¯ãªåé¢ãæ¹å€çã«æ€èšããŸãã ãŸããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éã«æ確ãªå¢çç·ããªãã³ãŒãã®ä»£æ¿æ¡ãæ€èšããŠãã ããã
æšæºã¢ãããŒãã®çæ
ãããžã§ã¯ããæšæºçã«2ã€ã®éšåã«åå²ããããšã®äž»ãªæ¬ ç¹ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®ããžãã¹ããžãã¯ã䟵é£ãããããšã§ãã ãã©ãŠã¶ã§ãã©ãŒã å ã®ããŒã¿ãç·šéããã¯ã©ã€ã¢ã³ãã³ãŒãã§æ€èšŒããç¥ç¶ã®æïŒãµãŒããŒïŒã«éä¿¡ããŸãã ãµãŒããŒã¯å¥ã®ãããžã§ã¯ãã§ãã ããã§ãåä¿¡ããããŒã¿ã®æ£ç¢ºãã確èªããïŒã€ãŸããã¯ã©ã€ã¢ã³ãã®æ©èœãè€è£œããïŒãè¿œå ã®æäœãè¡ãïŒããŒã¿ããŒã¹ã«ä¿åãããé»åã¡ãŒã«ãéä¿¡ãããªã©ïŒå¿ èŠããããŸãã
ãããã£ãŠããã©ãŠã¶ãŒã®ãã©ãŒã ãããµãŒããŒã®ããŒã¿ããŒã¹ãŸã§ã®æ å ±ã®ãã¹å šäœã远跡ããã«ã¯ã2ã€ã®ç°ãªãã·ã¹ãã ã詳ãã調ã¹ãå¿ èŠããããŸãã 圹å²ãããŒã ã«åãããŠãããããã¯ãšã³ããšããã³ããšã³ãã«ç°ãªãå°é家ã責任ãè² ãå Žåããããã®åæã«é¢é£ããŠè¿œå ã®çµç¹äžã®åé¡ãçºçããŸãã
倢ãèŠãŠã¿ãŸããã
1ã€ã®ã¢ãã«ã§ãã¯ã©ã€ã¢ã³ãäžã®ãã©ãŒã ãããµãŒããŒäžã®ããŒã¿ããŒã¹ãžã®ããŒã¿ãã¹å šäœãèšè¿°ã§ãããšããŸãã ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãïŒã³ãŒãã¯æ©èœããŠããŸããïŒïŒ
class MyDataModel { // verifyData(data) { // .... return true; } // client saveData(data) { if(this.verifyData(data)) this.writeDataToDb(data) else consol.log('error') } // . server writeDataToDb(data) { if(this.verifyData(data)) this.db.insert(data) else consol.log('error') } }
ãããã£ãŠãã¢ãã«ã®ããžãã¹ããžãã¯å šäœãç®ã®åã«ãããŸãã ãã®ãããªã³ãŒãã®ä¿å®ã¯ç°¡åã§ãã 1ã€ã®ã¢ãã«ã«ã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¡ãœãããçµã¿åããããšã次ã®ãããªå©ç¹ããããŸãã
- ããžãã¹ããžãã¯ã¯1ç®æã«éäžããŠãããã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§å ±æããå¿ èŠã¯ãããŸããã
- ãããžã§ã¯ãéçºã®éçšã§ããµãŒããŒããã¯ã©ã€ã¢ã³ããžããŸãã¯ã¯ã©ã€ã¢ã³ããããµãŒããŒãžæ©èœãç°¡åã«ç§»è¡ã§ããŸãã
- ããã¯ãšã³ããšããã³ããšã³ãã§åãã¡ãœãããè€è£œããå¿ èŠã¯ãããŸããã
- ãããžã§ã¯ãã®ããžãã¹ããžãã¯å šäœã«å¯Ÿããåäžã®ãã¹ãã»ããã
- ãããžã§ã¯ãã®è²¬ä»»ã®æ°Žå¹³ç·ãåçŽç·ã«çœ®ãæããŸãã
æåŸã®ãã€ã³ãããã詳现ã«æããã«ããŸãã ãã®ãããªã¹ããŒã ã®åœ¢åŒã®éåžžã®ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ããªã±ãŒã·ã§ã³ãæ³åããŠãã ããã
Vasyaã¯ããã³ããšã³ããFedya-ããã¯ãšã³ããæ åœããŸãã 責任ã®ç·ã¯æ°Žå¹³ã«èµ°ã£ãŠããŸãã ãã®æ¹åŒã«ã¯ãåçŽæ§é ã®æ¬ ç¹ããããŸããã¹ã±ãŒãªã³ã°ãé£ãããèé害æ§ãäœãã§ãã ãããžã§ã¯ããæ¡å€§ããŠããå ŽåãVasyaãšFedyaã®ã©ã¡ãã匷åããããšãããããªãé£ããéžæãããå¿ èŠããããŸãã ãŸãã¯ãFedyaãç æ°ã«ãªã£ãããèŸãããããå ŽåãVasyaã¯åœŒã眮ãæããããšã¯ã§ããŸããã
ããã§ææ¡ããã¢ãããŒãã«ããã責任ç¯å²ã90床æ¡åŒµããåçŽã¢ãŒããã¯ãã£ãæ°Žå¹³ã«å€ããããšãã§ããŸãã
ãã®ãããªã¢ãŒããã¯ãã£ã¯ãã¹ã±ãŒãªã³ã°ãã¯ããã«å®¹æã§ããã©ãŒã«ããã¬ã©ã³ãã§ãã VasyaãšFedyaã¯äº€æå¯èœã«ãªããŸãã
çè«çã«ã¯èŠæ ããè¯ãã®ã§ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®åå¥ã®ååšããããããã¹ãŠã倱ãããšãªããããããã¹ãŠãå®è·µã«ç§»ããŠã¿ãŸãããã
åé¡ã®å£°æ
補åã«çµ±åãããã¯ã©ã€ã¢ã³ããµãŒããŒã¯çµ¶å¯Ÿã«å¿ èŠãããŸããã ããã©ãããããã®ãããªæ±ºå®ã¯ãããã芳ç¹ããéåžžã«æ害ã§ãã ã¿ã¹ã¯ã¯ãéçºããã»ã¹ã§ã¯ãããã¯ãšã³ããšããã³ããšã³ãã®ããŒã¿ã¢ãã«ã®åäžã®ã³ãŒãããŒã¹ãæã€ããšã§ãããåºåã¯ç¬ç«ããã¯ã©ã€ã¢ã³ããšãµãŒããŒã«ãªããŸãã ãã®å Žåãæšæºçãªã¢ãããŒãã®ãã¹ãŠã®å©ç¹ãåŸãããäžèšã®ãããžã§ã¯ãã®éçºãšãµããŒãã®å©äŸ¿æ§ãåŸãããŸãã
解決ç
ç§ã¯ããªãé·ãéã1ã€ã®ãã¡ã€ã«ã«ã¯ã©ã€ã¢ã³ããšãµãŒããŒãçµ±åããå®éšãè¡ã£ãŠããŸããã æè¿ãŸã§ã®äž»ãªåé¡ã¯ãæšæºJSã§ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ãµãŒãããŒãã£ã¢ãžã¥ãŒã«ã®æ¥ç¶ãããŸãã«ãç°ãªã£ãŠããããšã§ãããnode.jsã®requireïŒ...ïŒãã¯ã©ã€ã¢ã³ãã®ãã¹ãŠã®AJAXããžãã¯ã ESã¢ãžã¥ãŒã«ã®ç»å Žã«ããããã¹ãŠãå€åããŸããã ææ°ã®ãã©ãŠã¶ã§ã¯ããã€ã³ããŒãããé·ãéãµããŒããããŠããŸãã Node.jsã¯ãã®ç¹ã§è¥å¹²é ããŠãããESã¢ãžã¥ãŒã«ã¯ã--experimental-modulesããã©ã°ãæå¹ã«ããå Žåã®ã¿ãµããŒããããŸãã è¿ãå°æ¥ãnode.jsã§ã¢ãžã¥ãŒã«ããã®ãŸãŸåäœããããšãæåŸ ãããŠããŸãã ããã«ãäœãã倧ããå€ããããšã¯ãŸããããŸããã ãã©ãŠã¶ã§ã¯ããã®æ©èœã¯ããã©ã«ãã§é·ãéæ©èœããŠããŸãã ESã¢ãžã¥ãŒã«ãã¯ã©ã€ã¢ã³ãã ãã§ãªããµãŒããŒåŽã§ã䜿çšã§ããããã«ãªã£ããšæããŸãïŒãã®ä»¶ã«ã€ããŠåè«ãããå Žåã¯ãã³ã¡ã³ããæžããŠãã ããïŒã
ãœãªã¥ãŒã·ã§ã³ã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã
ãããžã§ã¯ãã«ã¯3ã€ã®äž»èŠãªã«ã¿ãã°ãå«ãŸããŠããŸãã
ä¿è· -ããã¯ãšã³ãã
ãããªã㯠-ããã³ããšã³ãã
å ±æ -å ±æã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«ã
å¥ã®ãªãã¶ãŒããŒããã»ã¹ãå ±æãã£ã¬ã¯ããªå ã®ãã¡ã€ã«ãç£èŠããå€æŽããããšãã¯ã©ã€ã¢ã³ãçšãšãµãŒããŒçšïŒä¿è·/å ±æããã³ãããªãã¯/å ±æãã£ã¬ã¯ããªå ïŒã«å€æŽãã¡ã€ã«ã®ããŒãžã§ã³ãåå¥ã«äœæããŸãã
å®è£
ã·ã³ãã«ãªãªã¢ã«ã¿ã€ã ã¡ãã»ã³ãžã£ãŒã®äŸãèããŠã¿ãŸãããã æ°ããnode.jsïŒããŒãžã§ã³11.0.0ããããŸãïŒããã³RedisïŒã€ã³ã¹ããŒã«ã«ã€ããŠã¯ããã§ã¯èª¬æããŸããïŒãå¿ èŠã§ãã
äŸã®ã¯ããŒã³ãäœæããŸãã
git clone https://github.com/Kolbaskin/both-example cd ./both-example npm i
ãªãã¶ãŒããŒããã»ã¹ïŒå³ã®ãªãã¶ãŒããŒïŒãã€ã³ã¹ããŒã«ããŠå®è¡ããŸãã
npm i both-js -g both ./index.mjs
ãã¹ãŠãæ£åžžã§ããå Žåããªãã¶ãŒããŒã¯WebãµãŒããŒãèµ·åããå ±æããã³ä¿è·ããããã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã®å€æŽã®ç£èŠãéå§ããŸãã å ±æãå€æŽããããšãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ããŒã¿ã¢ãã«ã®å¯Ÿå¿ããããŒãžã§ã³ãäœæãããŸãã ä¿è·ãå€æŽããããšããŠã©ããã£ãŒã¯èªåçã«WebãµãŒããŒãåèµ·åããŸãã
ãªã³ã¯ãã¯ãªãã¯ãããšããã©ãŠã¶ã§ã¡ãã»ã³ãžã£ãŒã®ããã©ãŒãã³ã¹ã確èªã§ããŸã
http://localhost:3000/index.html?token=123&user=Vasya
ïŒããŒã¯ã³ãšãŠãŒã¶ãŒã¯ä»»æã§ãïŒã è€æ°ã®ãŠãŒã¶ãŒããšãã¥ã¬ãŒãããã«ã¯ãç°ãªãããŒã¯ã³ãšãŠãŒã¶ãŒãæå®ããŠãå¥ã®ãã©ãŠã¶ãŒã§åãããŒãžãéããŸãã
ä»ãå°ãã³ãŒãã
WebãµãŒããŒ
ä¿è·ããã/ server.mjs
import express from 'express'; import bodyParser from 'body-parser'; // - // - import wsServer from './lib/wsServer.mjs'; const app = express(); // - wsServer(app); // mime mjs express.static.mime.define({'application/javascript': ['js','mjs']}); app.use( bodyParser.json() ); app.use(bodyParser.urlencoded({ extended: true })); // public app.use(express.static('public')); const server = app.listen(3000, () => { console.log('server is running at %s', server.address().port); });
ããã¯éåžžã®ãšã¯ã¹ãã¬ã¹ãµãŒããŒã§ãããããã§ã¯äœãèå³æ·±ãããšã¯ãããŸããã node.jsã®ESã¢ãžã¥ãŒã«ã«ã¯ãmjsæ¡åŒµãå¿ èŠã§ãã äžè²«æ§ãä¿ã€ããã«ãã¯ã©ã€ã¢ã³ãã«ããã®æ¡åŒµæ©èœã䜿çšããŸãã
ã客æ§
public / index.html
<!DOCTYPE html> <html lang="en"> <head> ... <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="/main.mjs" type="module"></script> </head> <body> ... <ul id="users"> <li v-for="user in users"> {{ user.name }} ({{user.id}}) </li> </ul> <div id="messages"> <div> <input type="text" v-model="msg" /> <button v-on:click="sendMessage()"></button> </div> <ul> <li v-for="message in messages">[{{ message.date }}] <strong>{{ message.text }}</strong></li> </ul> </div> </body> </html>
ããšãã°ãã¯ã©ã€ã¢ã³ãã§Vueã䜿çšããŠããŸãããæ¬è³ªã¯å€ãããŸããã Vueã®ä»£ããã«ãããŒã¿ã¢ãã«ãå¥ã®ã¯ã©ã¹ïŒããã¯ã¢ãŠããè§åºŠïŒã«åé¢ã§ãããã®ããããŸãã
public / main.mjs
// - import ws from "/lib/Ws.mjs"; // import Messages from "./shared/messages/model/dataModel.mjs"; // import Users from "./shared/users/model/dataModel.mjs"; // - ( ) window.WS = new ws({ token: new URLSearchParams(document.location.search).get("token"), user: new URLSearchParams(document.location.search).get("user") }); // new Messages({ el: '#messages' }) // new Users({ el: '#users' })
main.mjsã¯ãããŒã¿ã¢ãã«ã察å¿ãããã¥ãŒã«é¢é£ä»ããã¹ã¯ãªããã§ãã ã³ãŒããç°¡çŽ åããããã«ãã¢ã¯ãã£ããŠãŒã¶ãŒãšã¡ãã»ãŒãžãã£ãŒãã®ãªã¹ãã®ãµã³ãã«è¡šçŸãindex.htmlã«çŽæ¥çµã¿èŸŒãŸããŠããŸã
ããŒã¿ã¢ãã«
å ±æ/ã¡ãã»ãŒãž/ã¢ãã«/ dataModel.mjs
// // , // import Base from '@root/lib/Base.mjs'; export default class dataModel extends Base { //!#client constructor(attr) { attr.data = { msg: '', messages: [] } super(attr); // this.on('newmessage', (data) => { this.messages.push(data) }) } //!#client async sendMessage(e) { // await this.$sendMessage(this.msg); this.msg = ''; } //!#server async $sendMessage(text) { // newmessage this.fireEvent('newmessage', 'all', { date: new Date(), text }) return true; } }
ãããã®ããã€ãã®ã¡ãœããã¯ãã¡ãã»ãŒãžããªã¢ã«ã¿ã€ã ã§éåä¿¡ãããã¹ãŠã®æ©èœãå®è£ ããŸãã ãã£ã¬ã¯ãã£ãïŒ#Clientããã³ïŒ#Serverã¯ããªãã¶ãŒããŒããã»ã¹ã«ã©ã®éšåïŒã¯ã©ã€ã¢ã³ããŸãã¯ãµãŒããŒïŒã®ã©ã®ã¡ãœããã察象ãšããããæ瀺ããŸãã ã¡ãœãããå®çŸ©ããåã«ãããã®ãã£ã¬ã¯ãã£ãããªãå Žåããã®ãããªã¡ãœããã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§å©çšã§ããŸãã ãã£ã¬ã¯ãã£ãã®åã®ã³ã¡ã³ãã¹ã©ãã·ã¥ã¯ãªãã·ã§ã³ã§ãããæšæºIDEãæ§æãšã©ãŒã宣èªããªãããã«ããããã«ã®ã¿ååšããŸãã
ãã¹ã®æåã®è¡ã¯ïŒã«ãŒãæ€çŽ¢ã䜿çšããŸãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ããŒãžã§ã³ãçæããå ŽåãïŒrootã¯ããããããããªãã¯ããã³ä¿è·ãã£ã¬ã¯ããªãžã®çžå¯Ÿãã¹ã«çœ®ãæããããŸãã
ãã1ã€ã®éèŠãªç¹ïŒã¯ã©ã€ã¢ã³ãã¡ãœããããã¯ãååãã$ãã§å§ãŸããµãŒããŒã¡ãœããã®ã¿ãåŒã³åºãããšãã§ããŸãã
... // async sendMessage(e) { await this.$sendMessage(this.msg); <- this.msg = ''; } ...
ããã¯ã»ãã¥ãªãã£äžã®çç±ã§è¡ãããŸããå€éšããã¯ããã®ããã«ç¹å¥ã«èšèšãããæ¹æ³ã«ããé Œãããšãã§ããŸããã
ãªãã¶ãŒããŒãã¯ã©ã€ã¢ã³ããšãµãŒããŒçšã«çæããããŒã¿ã¢ãã«ã®ããŒãžã§ã³ãèŠãŠã¿ãŸãããã
ã¯ã©ã€ã¢ã³ã ïŒãããªãã¯/å ±æ/ã¡ãã»ãŒãž/ã¢ãã«/ dataModel.mjsïŒ
import Base from '/lib/Base.mjs'; export default class dataModel extends Base { __getFilePath__() {return "messages/model/dataModel.mjs"} // constructor(attr) { attr.data = { msg: '', messages: [] } super(attr); // this.on('newmessage', (data) => { this.messages.push(data) }) } // async sendMessage(e) { // await this.$sendMessage(this.msg); this.msg = ''; } // ... async $sendMessage() {return await this.__runSharedFunction("$sendMessage",arguments)} }
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãã¢ãã«ã¯Vueã¯ã©ã¹ã®åå«ã§ãïŒBase.mjsçµç±ïŒã ãããã£ãŠãéåžžã®VueããŒã¿ã¢ãã«ãšåæ§ã«äœ¿çšã§ããŸãã ãªãã¶ãŒããŒã¯__getFilePath__ã¡ãœãããã¢ãã«ã®ã¯ã©ã€ã¢ã³ãããŒãžã§ã³ã«è¿œå ããŸãããããã¯ã¯ã©ã¹ãã¡ã€ã«ãžã®ãã¹ãè¿ãã$ sendMessageãµãŒããŒã¡ãœããã³ãŒãããæ¬è³ªçã«rpcã¡ã«ããºã ïŒ__runSharedFunctionã¯èŠªã¯ã©ã¹ã§å®çŸ©ãããŸãïŒãä»ããŠãµãŒããŒã§å¿ èŠãªã¡ãœãããåŒã³åºãæ§æäœã«çœ®ãæããŸããã
ãµãŒã㌠ïŒä¿è·/å ±æ/ã¡ãã»ãŒãž/ã¢ãã«/dataModel.mjsïŒ
import Base from '../../lib/Base.mjs'; export default class dataModel extends Base { __getFilePath__() {return "messages/model/dataModel.mjs"} ... ... // async $sendMessage(text) { // newmessage this.fireEvent('newmessage', 'all', { date: new Date(), text }) return true; } }
ãµãŒããŒããŒãžã§ã³ã§ã¯ã__ getFilePath__ã¡ãœãããè¿œå ããããã£ã¬ã¯ãã£ãã§ããŒã¯ãããã¯ã©ã€ã¢ã³ãã¡ãœããã¯åé€ãããŸãïŒ#Client
çæãããã¢ãã«ã®äž¡æ¹ã®ããŒãžã§ã³ã§ã¯ãåé€ãããè¡ã¯ãã¹ãŠç©ºã®è¡ã«çœ®ãæããããŸãã ããã¯ããããã¬ãŒã®ãšã©ãŒã¡ãã»ãŒãžãã¢ãã«ã®ãœãŒã¹ã³ãŒãå ã®åé¡ã®ããè¡ãç°¡åã«èŠã€ããããšãã§ããããã«ããããã§ãã
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®çžäºäœçš
ã¯ã©ã€ã¢ã³ãã§ãµãŒããŒã¡ãœãããåŒã³åºãå¿ èŠãããå Žåã¯ããããè¡ãã ãã§ãã
åŒã³åºããåãã¢ãã«å ã«ããå Žåããã¹ãŠãç°¡åã§ãïŒ
... !#client async sendMessage(e) { await this.$sendMessage(this.msg); this.msg = ''; } !#server async $sendMessage(msg) { // - } ...
å¥ã®ã¢ãã«ãããã«ãã§ããŸãã
import dataModel from "/shared/messages/model/dataModel.mjs"; var msg = new dataModel(); msg.$sendMessage('blah-blah-blah');
éæ¹åãããªãã¡ ãµãŒããŒã§ã¯ã©ã€ã¢ã³ãã¡ãœãããåŒã³åºããŠãæ©èœããŸããã æè¡çã«ã¯ãããã¯å®è¡å¯èœã§ãããå®çšçãªèŠ³ç¹ããã¯æå³ããããŸããã ãµãŒããŒã¯1ã€ã§ãããå€ãã®ã¯ã©ã€ã¢ã³ãããããŸãã ã¯ã©ã€ã¢ã³ãäžã®ãµãŒããŒã§ã¢ã¯ã·ã§ã³ãéå§ããå¿ èŠãããå Žåãã€ãã³ãã¡ã«ããºã ã䜿çšããŸãã
// ... //!#client constructor(attr) { .... // "newmessage" this.on('newmessage', (data) => { this.messages.push(data) }) } //!#server async $sendMessage(text) { // newmessage this.fireEvent('newmessage', 'all', { date: new Date(), text }) return true; } ...
fireEventã¡ãœããã¯3ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãïŒã€ãã³ãã®ååãã€ãã³ãã®å®å ãããã³ããŒã¿ã åä¿¡è ã¯ããã€ãã®æ¹æ³ã§èšå®ã§ããŸããããŒã¯ãŒããallã-ã€ãã³ãã¯ãã¹ãŠã®ãŠãŒã¶ãŒãŸãã¯é åã«éä¿¡ãããã€ãã³ãã®å®å ãšãªãã¯ã©ã€ã¢ã³ãã®ã»ãã·ã§ã³ããŒã¯ã³ããªã¹ããããŸãã
ã€ãã³ãã¯ããŒã¿ã¢ãã«ã¯ã©ã¹ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«é¢é£ä»ããããŠãããããã³ãã©ãŒã¯ãfireEventãåŒã³åºãããã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§èµ·åããŸãã
æ°Žå¹³ããã¯ãšã³ãã®ã¹ã±ãŒãªã³ã°
ææ¡ãããå®è£ ã«ãããã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãã«ã®ã¢ããªã·ãã¯æ§ã¯ãäžèŠããµãŒããŒéšåã®æ°Žå¹³ã¹ã±ãŒãªã³ã°ã®å¯èœæ§ã«å€§ããªå¶éã課ãã¯ãã§ãã ããããããã¯ããã§ã¯ãããŸãããæè¡çã«ã¯ããµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã«äŸåããŠããŸããã ããããªãã¯ããã£ã¬ã¯ããªãã©ãã«ã§ãã³ããŒããŠããã®ã³ã³ãã³ããä»ã®WebãµãŒããŒïŒnginxãapacheãªã©ïŒçµç±ã§æäŸã§ããŸãã
ãµãŒããŒããŒãã¯ãæ°ããããã¯ãšã³ãã€ã³ã¹ã¿ã³ã¹ãèµ·åããããšã§ç°¡åã«æ¡åŒµã§ããŸãã RedisãšKueãã¥ãŒã·ã¹ãã ã¯ãåã ã®ã€ã³ã¹ã¿ã³ã¹ãšå¯Ÿè©±ããããã«äœ¿çšãããŸãã
1ã€ã®ããã¯ãšã³ãã«å¯ŸããAPIãšç°ãªãã¯ã©ã€ã¢ã³ã
å®éã®ãããžã§ã¯ãã§ã¯ãå€æ§ãªãµãŒããŒã¯ã©ã€ã¢ã³ãã1ã€ã®ãµãŒããŒAPIïŒWebãµã€ããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ããµãŒãããŒãã£ãµãŒãã¹ïŒã䜿çšã§ããŸãã ææ¡ããããœãªã¥ãŒã·ã§ã³ã§ã¯ãããã¯ãã¹ãŠè¿œå ã®ãã³ã¹ãªãã§å©çšã§ããŸãã ãµãŒããŒã¡ãœããã®åŒã³åºãã®è£ã«ã¯ãå€ãè¯ãRPCããããŸãã WebãµãŒããŒèªäœã¯ãã¯ã©ã·ãã¯ãšã¯ã¹ãã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã§ãã åãããŒã¿ã¢ãã«ã®å¿ èŠãªã¡ãœãããåŒã³åºãã«ãŒãã«ã©ãããŒãè¿œå ããã ãã§ååã§ãã
ãã¹ãå°æ¬
ãã®èšäºã§ææ¡ãããŠããã¢ãããŒãã¯ãã¯ã©ã€ã¢ã³ããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã®é©åœçãªå€æŽã䞻匵ãããã®ã§ã¯ãããŸããã éçºããã»ã¹ã«ã»ãã®å°ãã®å¿«é©ããè¿œå ããã ãã§ã1ãæã§çµã¿ç«ãŠãããããžãã¹ããžãã¯ã«éäžã§ããŸãã
ãã®ãããžã§ã¯ãã¯å®éšçã§ãããããªãã®æèŠã§ã¯ããã®å®éšãç¶ç¶ãã䟡å€ããããã©ãããã³ã¡ã³ãã«æžããŠãã ããã