ã¯ããã«
å¹´å§ã«ã¢ã¯ã¿ã¼ã¢ãã«ã«ã¤ãã¦ã®ç解ãæ·±ããããKotlin ãç¨ã㦠Pekko ã§ã¢ã¯ã¿ã¼ã¢ãã«ã®ä½ç½®ééæ§ã«è§¦ãã¦ã¿ãã®ã§ããã®å 容ãã¡ã¢ãã¦ããã¾ãã
Kotlin 㧠pekko-cluster ãç¨ãã¦è©¦ããå®éã®ãµã³ãã«ã¯ãã¡ãã§ãã
ã¾ããããããã¢ã¯ã¿ã¼ã¢ãã«ã¨ã¯ä½ãªã®ã§ããããï¼
ä¸ã®ä¸ã®è¦æ±å¤åããè¦ã¦ããã¾ãã
ä¸ã®ä¸ã®è¦æ±ã®å¤é·
CPU å±æ©
90 年代ããã¾ã§ãã¢ããªã±ã¼ã·ã§ã³ã¯ã·ã³ã°ã«ã¹ã¬ããã§åãã®ãä¸è¬çã§ããã
ãã®ãããä¸ã®ä¸ã¨ãã¦ã¯é«éãªCPUãå¸å ´ã«åºåãã®ãå¾ ã£ã¦ãããããªæ代ã§ãã(çè ã¨ãã¦ã¯çã¾ãã¦éããªãã®ã§ãã¾ããã®é ã®ãã¨ã¯ããåãã£ã¦ã¾ãã)
ãããã2005 å¹´é ã« CPU ã®ã¯ããã¯é度ã®åä¸ã¯éçã«éãã¦ããã¨ããè«æãæå±ããã¾ããã
- The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
- ããCPU å¾ ã¡ã§ããªã¼ã©ã³ããé£ã¹ã¦ãå ´åãããªãããã¨ãããªããªããããããªã¿ã¤ãã«ã§ã
- ã¢ããªã±ã¼ã·ã§ã³ã®é«éåã®ããã«ã¯ã並è¡å¦çã«è»¢æãã¦ãããªãã¨ãããªãããã¨ãã£ããã¨ãæ¸ããã¦ãã¾ã
åææ(2005 å¹´)ã«ãã¯ã©ã¹ã¿ã¼åããããã«ãããã»ããµã¼ãµã¼ãä¸ã§ã¢ããªã±ã¼ã·ã§ã³ãåããä¼æ¥ãåºã¦ãã¾ããããã«ãã³ã¢ã®ç»å ´ã§ãã
ãããããã«ãã³ã¢ã¯åä¸ã³ã¢ãä½éã«ãªãå¾åããããããã¢ããªã±ã¼ã·ã§ã³ã®ä¸¦è¡åº¦ãä½ãã¨ããã©ã¼ãã³ã¹ãä½ä¸ããã¨ããåé¡ãåºã¦ãã¾ããã ã§ã¯ãã¹ã¬ããããã°ã©ãã³ã°ã«ããã°ããã®ã§ã¯ï¼ã¨ãªãã¨ãä¸è¨ã®ãããªåé¡ãçºçããã¨è¨ããã¦ã¾ãã
- ãããããã¯ã®ãªã¹ã¯
- è¤æ°ã®ã¹ã¬ãããäºãã®ãªã½ã¼ã¹ã®éæ¾ãå¾ ã¡ç¶ãããªã¹ã¯ãããã¯ã®é åºç®¡çãªã©ã®ããã©ããè¾ã
- ãã¼ã¿ã®ç«¶åç¶æ
(race condition) ã®ãªã¹ã¯
- è¤æ°ã¹ã¬ãããå ±æã¡ã¢ãªç©ºéã«ã¢ã¯ã»ã¹ããããããã®åé¡ãçã¾ããããããªã½ã¼ã¹ã¢ã¯ã»ã¹å¶å¾¡ã®é£æ度ãé«ã
- ã¨ã©ã¼ãã³ããªã³ã°ã¨ãããã°ã®è¤éæ§
- è¤æ°ã¹ã¬ããã§ä¸¦è¡ããã®ã§ãããããåããè¾ã
C10K åé¡
CPU å±æ©ã®åããä¸ã®ä¸ã®ã¯ã©ã¤ã¢ã³ãæ°ã¯è¨å¤§ã«å¢ãã¦ããã¾ããã
ã¢ã¯ã»ã¹ããã¯ã©ã¤ã¢ã³ãæ°ã1ä¸ãè¶ ããã¨ããµã¼ãã¼ã®ã¹ã¬ããæ°ãå¢ãã¦ããµã¼ãã¡ã¢ãªã®ãªã½ã¼ã¹ä¸è¶³ãçºçãã¦ãã¾ãåé¡ã§ãã
å¦çè½åã«ä½åããã£ã¦ãããµã¼ãå°æ°ãå¢ãããªãã¨ãããªãã¨ãã課é¡ãåºã¦ãã¾ããã
ããã«å¯¾ãã¦åºã¦ãã解決çã¨ãã¦ããã³ããããã³ã°I/Oãã¤ãã³ãã«ã¼ãã§å¯¾å¿ããã®ãNode.js (2009å¹´ã)ã«ãªãã¾ãã
Akka(Pekko) ãæä¾ããã¢ã¯ã¿ã¼ã¢ãã«ãã¾ãããã®ãããªåé¡ã解決ããããã®ãã®ã¨ãªã£ã¦ãã¾ãã
ã¢ã¯ã¿ã¼ã¢ãã«ã¨ã¯ï¼
Node.js ã¯ã·ã³ã°ã«ã¹ã¬ããã§ã§ãã³ããããã³ã°I/O ã¨ã¤ãã³ãã«ã¼ããè¡ããã¨ã§ãããã®åé¡ã解決ãã¾ããããã¢ã¯ã¿ã¼ã¢ãã«ã§ã¯ãä¸è¨ã®ãããªä»çµã¿ã§ããããåé¡ã解決ãã¦ãã¾ãã
- ãã«ãã¹ã¬ãã + ã¢ã¯ã¿ã¼
- Akkaã¯ãã«ãã¹ã¬ããç°å¢ã§åä½ããå¤æ°ã®ã¢ã¯ã¿ã¼ã並è¡ãã¦å®è¡ãã¾ã
- ã¢ã¯ã¿ã¼
- ã¢ã¯ã¿ã¼ã¯ç¬ç«ããè¨ç®ã®åä½ã§ããããããããèªèº«ã®ç¶æ ã¨ã¡ã¼ã«ããã¯ã¹ãæã¡ã¾ã
- ã¡ãã»ã¼ã¸ããã·ã³ã°
- ã¢ã¯ã¿ã¼éã®éä¿¡ã¯ãéåæçãªã¡ãã»ã¼ã¸ããã·ã³ã°ã«ãã£ã¦è¡ããã¾ã
ãã«ãã³ã¢ãæå¹æ´»ç¨ã§ããã¢ã¯ã¿ã¼ããããã¯ç¬ç«ãã¦ãããããé害æãªã©ã®å復æ§ã«å¼·ãã¨è¨ããã¦ãã¾ãã
Akka/Pekko ã¨ã¯
Akka(Pekko) ã¯ãLightbend社ã«ãã£ã¦æä¾ãããã¢ã¯ã¿ã¼ããã°ã©ãã³ã°ã¢ãã«ã¨ã©ã³ã¿ã¤ã ããããã«å¿ è¦ãªè£å©ãã¼ã«ãæä¾ãããéçºãã¼ã«ãããã§ãã
Akka/Pekko ã®éã
Akka 㯠Akka 2.7 ããã©ã¤ã»ã³ã¹ã Business Source License(BSL)
ã«å¤ãããæ¬çªç°å¢ã§ã®ç¨¼åã«ã¯Lightbend社ã®æåã©ã¤ã³ã»ã³ã¹ãå¿
è¦ã«ãªãã¾ããã
Pekkoã¯ã Akka 2.6 ãããã©ã¼ã¯ããããªã¼ãã³ã½ã¼ã¹ããã¸ã§ã¯ãã«ãªãã¾ãã
ã©ã¤ã»ã³ã¹ã®è©±ã«ã¤ãã¦ã¯ããã¡ãã®è¨äºãã¨ã¦ãåèã«ãªãã¾ããã
Akka/Pekko ã®ä½ç½®ééæ§ã«ã¤ãã¦
ã¢ã¯ã¿ã¼ã¯ãç¶æ ã¨æ¯ãèããã«ãã»ã«åãããªãã¸ã§ã¯ãã§ãããåä¿¡è ã®ã¡ã¼ã«ããã¯ã¹ã«ã¡ãã»ã¼ã¸ãç½®ããã¨ã§ã¡ãã»ã¼ã¸ã交æããæä»çã«éä¿¡ãã¾ãã ããæå³ã§ã¯ãã¢ã¯ã¿ã¼ã¯ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã®ä¸ã§æãå³æ ¼ãªå½¢å¼ã§ããã人éã«ã¨ã£ã¦ã¯ããç解ãããããã®ã§ãã
akka-ja-2411-translated.netlify.app
Akka/Pekko ã¯åã¢ã¯ã¿ã¼å ã«ç¶æ ã¨æ¯ãèããæã£ã¦ãã¦ãã¢ã¯ã¿ã¼å士ã§æä»çã«ã¡ãã»ã¼ã¸ã®ããåãããã¾ãã
å³ã§ç¤ºãã¨ä¸è¨ã®ãããªå½¢ã§ãã
ã¢ã¯ã¿ã¼ã¯
- ã¡ãã»ã¼ã¸é§åã§åä½ãã
- 親ã¢ã¯ã¿ã¼ããåã¢ã¯ã¿ã¼ã«ã¡ãã»ã¼ã¸ã渡ããã¨ãå¯è½
- é害æã¯åã¢ã¯ã¿ã¼ããã®ã¨ã¹ã«ã¬ã¼ã·ã§ã³ãè¦ã¦ãããã¨ã§èé害æ§ãæ ä¿ãã¦ãã
ã¨ããã®ããã£ããããæ¦è¦³ã¨ãã£ãã¨ããã§ããããï¼
ããã¦ãããããæ¬é¡ã®Akka/Pekko ã®ä½ç½®ééæ§ã«ã¤ãã¦ã§ãã
ä¸å³ã§ç¤ºãããããã®ã¢ã¯ã¿ã¼ã¯ãã©ãã®ãµã¼ãã§å®è¡ãããã®ããã¢ããªã±ã¼ã·ã§ã³èªä½ã¯ã»ã¨ãã©æèããã«æ§ç¯ãããã¨ãã§ããããã§ãã
Akka/Pekkoã¯ãéåä¿¡ããã¡ãã»ã¼ã¸ã
- æå¹ãªã¹ã¬ããã§ãã¼ã«ã«ã§å¦çãã
- å¥ã®ãµã¼ãã«æãã¦ãªã¢ã¼ãã§å¦çãã
ã¨ããã®ããã¨ããè¨å®ãããã¨ãã§ããè¨è¨æã«ãã¾ãæèããã«å®è£ ãããã¨ãå¯è½ã§ãã
ããã«ã¯ãpekko-cluster ã¨ãããã®ãç¨ãã¾ãã
ã¤ã¡ã¼ã¸å³ã¨ãã¦ã¯ä¸è¨ã®ãããªæãã§ãã¢ããªã±ã¼ã·ã§ã³èªä½ã¯ãµã¼ãã®ç¶æ ãå·¦ãªã®ããå³ãªã®ãã¨ãã£ãé¢å¿ãä¿ã¤å¿ è¦ããªããã·ã³ãã«ãªè¨å®ã ãã§ãµã¼ãéã§ã®åæ£å¦çãå¯è½ã¨ãã¦ãã¾ãã
ããã¹ãã ãã ã¨ãã¾ãã¤ã¡ã¼ã¸ãã¤ããªãã®ã§ãå®éã«ãã£ã¦ã¿ã¾ãã
ãã£ã¦ã¿ã
ã·ã³ãã«ã«ããã¹ãã¡ãã»ã¼ã¸ã®éåä¿¡ãããã¢ããªã±ã¼ã·ã§ã³ãKotlinã§æ¸ããpekko-cluster ãç¨ãã¦å¥ãµã¼ãã¸ã®ã¡ãã»ã¼ã¸éä¿¡ããã£ã¦ã¿ã¾ãã
Java ã®ã¹ã¬ãããç¨ãã¦ã並åå¦çã試ã
ã¾ãã¯ãJava ã®ã¹ã¬ãããç¨ãã¦ã·ã³ãã«ã«éåæå¦çãä½æãã¾ãã
ä¸è¨ã®è¨äºãé常ã«åèã«ãªãã¾ããã
ã²ã¨ã¾ãä½æããJavaã¹ã¬ããããã¼ã¹ã¨ãã並è¡å¦çã¯ãã»ã¨ãã©ä¸è¨ã®åçµãªã®ã§ããã§ã¯å²æãã¾ãã
å®è£ ã¯ä¸è¨ã® commit æç¹ãåèãã ããã
æ¯è¼å¯¾è±¡ã¨ãã¦ãKoroutine ã使ã£ãä¾ãä½ã£ã¦ã¿ã¾ããã
Pekko ã«å¤ãã¦ãè¤æ°ã³ã³ããã§èµ·åããå¥Nodeã§Receiveãã
ã§ã¯ããã®å¦çãPekko ã«å¤ãã¦ãè¤æ°ã³ã³ããã§ã®ã¡ãã»ã¼ã¸éåä¿¡ã Pekko Cluster ãç¨ãã¦å®ç¾ãã¦ã¿ã¾ãã
Pekko Cluster ã¯ã è¤æ°ã®ã¢ã¯ã¿ã¼ã·ã¹ãã ãã¯ã©ã¹ã¿ã¨ãã¦ã¾ã¨ããããããåä¸ã®ã¢ã¯ã¿ã¼ã·ã¹ãã ä¸ã§åä½ãã¦ãããã®ããã«æ¯ãèããããã«ããããã®ãã®
ãã«ãªãã¾ãã
ã¾ãã¯ãã¢ããªã±ã¼ã·ã§ã³ãè¤æ°ã³ã³ããã§ç«ã¡ä¸ããããã«ãDockerãæ¸ãæãã¾ãã
Dockerfile
FROM gradle:8.12.0-jdk17 AS builder WORKDIR /workspace COPY apps/build.gradle.kts apps/settings.gradle.kts ./ COPY apps/src ./src RUN gradle clean build --no-daemon FROM openjdk:17-slim AS base WORKDIR /app # ãã«ãææç©ãã³ãã¼ COPY --from=builder /workspace/build/libs/*-all.jar /app/app.jar FROM base AS node1 EXPOSE 2551 CMD ["java", "-jar", "app.jar", "2551"] FROM base AS node2 EXPOSE 2552 CMD ["java", "-jar", "app.jar", "2552"] FROM base AS node3 EXPOSE 2553 CMD ["java", "-jar", "app.jar", "2553"]
compose.yaml
name: kotlin-actor-sample services: seed: container_name: pekko-cluster-seed build: context: .. dockerfile: docker/Dockerfile target: node1 ports: - "2551:2551" environment: CLUSTER_PORT: 2551 CLUSTER_IP: seed c1: container_name: pekko-cluster-c1 build: context: .. dockerfile: docker/Dockerfile target: node2 ports: - "2552:2552" environment: CLUSTER_PORT: 2552 CLUSTER_IP: c1 c2: container_name: pekko-cluster-c2 build: context: .. dockerfile: docker/Dockerfile target: node3 ports: - "2553:2553" environment: CLUSTER_PORT: 2553 CLUSTER_IP: c2
Javaã¹ã¬ããã§è©¦ããæ¹ã§ã¯ãsrc ãããªã¥ã¼ã ãã¦ã³ããã¦ãã®ã§ãããåä¸ã³ã¼ããè¤æ°ã³ã³ããã§è¦ããã¨ããã¨ãã¡ã¤ã«ããã·ã¥ãä¸ç·ã§ç«¶åã¨ã©ã¼ã¨ãªã£ã¦ãã¾ã£ãã®ã§ãä¸æ¦è³æ»ã§ ãããã .jar
ã«ãã«ããã¦å®è¡ãããã¨ã«ãã¾ããã
(並è¡å¦çã試ãéã®éçºç°å¢ã§ã®ããæ¹æ³ããã£ã¨ããã¯ãã»ã»ã»)
ããã¦ãApplication.kt
ãä¸è¨ã®ããã«å¤ãã¾ãã
Application.kt
package com.github.daitasu import org.apache.pekko.actor.typed.ActorSystem import org.apache.pekko.cluster.typed.Cluster import org.apache.pekko.cluster.typed.Join import com.typesafe.config.ConfigFactory fun main() { val port = System.getenv("CLUSTER_PORT")?.toIntOrNull() ?: 2551 val hostname = System.getenv("CLUSTER_IP") ?: "127.0.0.1" // Pekkoã®ããããã£ãè¨å® System.setProperty("pekko.remote.artery.canonical.hostname", hostname) System.setProperty("pekko.remote.artery.canonical.port", port.toString()) // application.conf ãèªã¿è¾¼ã val config = ConfigFactory.load() // ã¢ã¯ã¿ã¼ã·ã¹ãã ã®èµ·å val system = ActorSystem.create( GreetingActor.create(), "MyActorSystem", config ) // ã¯ã©ã¹ã¿ã«ãã¼ããJOIN ãã Cluster.get(system).manager().tell(Join.create(Cluster.get(system).selfMember().address())) if (port != 2551) { Thread.sleep(5000) val message = GreetingMessage("Hello World") system.tell(message) } println("Started ${Cluster.get(system).selfMember().address()}") }
GreetingActor.kt
package com.github.daitasu import org.apache.pekko.actor.typed.Behavior import org.apache.pekko.actor.typed.javadsl.Behaviors import org.apache.pekko.cluster.typed.Cluster data class GreetingMessage(val message: String) object GreetingActor { fun create(): Behavior<GreetingMessage> = Behaviors.receive<GreetingMessage> { context, message -> val member = Cluster.get(context.system).selfMember() println("[Address: ${member.address()}] Status: ${member.status()} Message: ${message.message}") Behaviors.same<GreetingMessage>() } }
åãããããã®ããã2ãã¡ã¤ã«ã«åãã¦ãã¾ããã Application.kt
ã§ã¯ä¸è¨ãè¡ã£ã¦ãã¾ãã
- ã¢ã¯ã¿ã¼ã·ã¹ãã ã®ããã®ããã¤ãã®è¨å®ã®è¿½å
- Cluster ã«åã³ã³ããã§åãã¦ããnode ãJOIN ãã
- seed node ã§ãªããã°ãMessageãéä¿¡ãã
GreetingActor.kt
ã§ã¯ãåã«ä»ã®ã¢ã¯ã¿ã¼ããåãåã£ãã¡ãã»ã¼ã¸ãèªèº«ã®ã¢ã¯ã¿ã¼ã®ç¶æ
ãªã©ã¨ä¸ç·ã« println
ãã¦ãã¾ãã
ä¸è¨ã¯ã¢ããªã±ã¼ã·ã§ã³ã®æåã§ããã val config = ConfigFactory.load()
ã§èªã¿è¾¼ãã§ããé¨åãéè¦ã§ãããã§pekko-cluster ã®è¨å®ããã¦ãã¾ãã
src/main/resources/application.conf
pekko { loglevel = debug version = "1.1.2" actor { provider = "cluster" debug { receive = off lifecycle = off } } remote { log-remote-lifecycle-events = on artery { canonical { hostname = ${clustering.ip} port = ${clustering.port} } } } cluster { seed-nodes = [ "pekko://"${clustering.cluster.name}"@"${clustering.seed-ip}":"${clustering.seed-port} ] } } clustering { ip = seed ip = ${?CLUSTER_IP} port = 2551 port = ${?CLUSTER_PORT} seed-ip = seed seed-port = 2551 cluster.name = MyActorSystem }
ãã®è¨å®ã«è¿½å ãã¦ããã ãã§ãseed-node ã®æå®ã¨ãåä¸Clusterä¸ã« remote-node ãè¨å®ãããã¨ãã§ãã¾ãã
ã§ã¯å®éã«ã docker compose up
ãã¦ã¿ã¾ãããã
log ãããã¤ã¾ãã§ã¿ã¾ãã
$docker compose up pekko-cluster-c1 | [MyActorSystem-pekko.actor.default-dispatcher-5] INFO org.apache.pekko.cluster.Cluster - pekkoMemberChanged Cluster Node [pekko://MyActorSystem@c1:2552] - Node [pekko://MyActorSystem@c1:2552] is JOINING itself (with roles [dc-default], version [0.0.0]) and forming new cluster pekko-cluster-c1 | [MyActorSystem-pekko.actor.default-dispatcher-5] INFO org.apache.pekko.cluster.Cluster - Cluster Node [pekko://MyActorSystem@c1:2552] - is the new leader among reachable nodes (more leaders may exist) pekko-cluster-c1 | [MyActorSystem-pekko.actor.default-dispatcher-5] INFO org.apache.pekko.cluster.Cluster - pekkoMemberChanged Cluster Node [pekko://MyActorSystem@c1:2552] - Leader is moving node [pekko://MyActorSystem@c1:2552] to [Up] pekko-cluster-c2 | [MyActorSystem-pekko.actor.default-dispatcher-3] INFO org.apache.pekko.cluster.Cluster - pekkoMemberChanged Cluster Node [pekko://MyActorSystem@c2:2553] - Leader is moving node [pekko://MyActorSystem@c2:2553] to [Up] pekko-cluster-seed | [MyActorSystem-pekko.actor.default-dispatcher-16] INFO org.apache.pekko.cluster.Cluster - Cluster Node [pekko://MyActorSystem@seed:2551] - Received InitJoin message from [Actor[pekko://MyActorSystem@c1:2552/system/cluster/core/daemon/joinSeedNodeProcess-1#1074045501]] to [pekko://MyActorSystem@seed:2551] pekko-cluster-seed | [MyActorSystem-pekko.actor.default-dispatcher-16] INFO org.apache.pekko.cluster.Cluster - Cluster Node [pekko://MyActorSystem@seed:2551] - Sending InitJoinAck message from node [pekko://MyActorSystem@seed:2551] to [Actor[pekko://MyActorSystem@c1:2552/system/cluster/core/daemon/joinSeedNodeProcess-1#1074045501]] (version [1.1.2]) pekko-cluster-seed | [MyActorSystem-pekko.actor.default-dispatcher-16] INFO org.apache.pekko.cluster.Cluster - Cluster Node [pekko://MyActorSystem@seed:2551] - Received InitJoin message from [Actor[pekko://MyActorSystem@c2:2553/system/cluster/core/daemon/joinSeedNodeProcess-1#1181724472]] to [pekko://MyActorSystem@seed:2551] pekko-cluster-seed | [MyActorSystem-pekko.actor.default-dispatcher-16] INFO org.apache.pekko.cluster.Cluster - Cluster Node [pekko://MyActorSystem@seed:2551] - Sending InitJoinAck message from node [pekko://MyActorSystem@seed:2551] to [Actor[pekko://MyActorSystem@c2:2553/system/cluster/core/daemon/joinSeedNodeProcess-1#1181724472]] (version [1.1.2]) pekko-cluster-c2 | Started pekko://MyActorSystem@c2:2553 pekko-cluster-c2 | [Address: pekko://MyActorSystem@c2:2553] Status: Up Message: Hello World pekko-cluster-c1 | Started pekko://MyActorSystem@c1:2552 pekko-cluster-c1 | [Address: pekko://MyActorSystem@c1:2552] Status: Up Message: Hello World
ç¡äºã« c1/c2 node ãã seed node ã«message ãéããã¾ããã
ãã®ä»ã«ããããããã®node ãClusterã®Memberã«ãªã£ã¦ãããã㪠log ãªã©ãè¦ãã¾ãã
ã¢ããªã±ã¼ã·ã§ã³ã³ã¼ãã®ä¸ã§åæ£å¦çã®ããã®å®è£
ããªã¢ã¼ããµã¼ããæèããå®è£
ãªã©ã¯è¦ããã application.conf
ã«è¨å®ããå
容ã ãã§ã»ã¨ãã©å®ç¾ãããã¨ãã§ãã¾ããã
ãããã«
ãã®è¨äºã§ã¯ãç°ãªããµã¼ãé(Docker ã³ã³ããé)ãpekko-cluster ãéãã¦åä¸ã¯ã©ã¹ã¿ä¸ã«ç½®ãã¦ãã¡ãã»ã¼ã¸ã®éåä¿¡ãããä¾ãä½ã£ã¦ã¿ã¾ããã
å®éã«ã¯ã¡ãã»ã¼ã¸ã®ç¨®é¡ã§éãã¢ã¯ã¿ã¼ãå¤ãããã¨ãã£ããã¨ã¯ããªãã®ã§ããã¾ãå®è·µçãªã¤ã¡ã¼ã¸ã¯æ¹§ãã¾ããããããã§ã¯ãµã¼ãéãã·ã³ãã«ã«ã¾ããã§ã¡ãã»ã¼ã¸ãéããã¦ãããã¨ãä½æã§ããã°è¯ãããªã¨èãã¦ã¾ãã
æ®æ®µNode.js ãããã³ãã¨ã³ãããã触ã£ã¦ãã¦ãJVMç³»è¨èªèªä½ãåå¿è ãªã®ã§çµæ§è¦æ¦ãã¾ããããNode.js ã¨éã£ãã¢ããã¼ãã§ã®è§£æ±ºæ¹æ³ããä½ç½®ééæ§ã®é¢ç½ããªã©ãå¦ã¹ã¦è¯ãã£ãã§ãã
ã¢ã¯ã¿ã¼ã¢ãã«ã¯ç¶æ
ã¨æ¯ãèããå
é¨ã«ã«ãã»ã«åãã¾ãããç¶æ
ã®æ°¸ç¶åã¯å¥é Pekko Persistence
ã¨ãããã®ãå¿
è¦ã§ãã
ãã®è¾ºãã¾ã§ç解ããªãã¨ãã¢ã¯ã¿ã¼ã¢ãã«ã®æ¨å³ã¯åãããªãããªã®ã§ãããå°ãè²ã ã¨èª¿ã¹ã¦è§¦ã£ã¦ãããããªã¨æãã¾ãã
Reference
ä»åã®ç解ãå®è£ ã«ããããä¸è¨ã®è¨äºãåèã«ããã¦ããã ãã¾ããã