Project Brief — BINUS Thesis (Artikel Ilmiah): Player State Synchronization Topologies
Purpose of this file: complete context for continuing this thesis project in a fresh environment (e.g. Claude Projects). Everything here is established fact from the working sessions of 2026-07-13 → 2026-08-07. The companion documents listed in §9 carry the full detail.
1. Student & administrative facts
- Author: Efran Nathanael — NIM 2602151891, Computer Science, BINUS Kemanggisan, telp 085211332390. GitHub
BadAccuracyID(aka LyraMS). Former Minecraft network developer (LuckyNetwork / Lucky Development Department), now CEO of Datahive. - Course: COMP6861001 Thesis, 2025 Even Semester, Non-Class track, type Artikel Ilmiah (~6-page conference paper; an A requires actual conference acceptance, so it must survive peer review).
- Topic (BINUS list): Jaringan / Networking.
- Calon pembimbing: Douglas Rakasiwi Nugroho (D6957) — requested, not yet approved. Others listed on the form: S2 Christopher Limawan (D6954), S3 Gredion Prajena (D4459); Co-S: Anderies (D6657), David (D4498), Muhammad Fikri Hasani (D6421).
- Proposal skripsi: filled into the official SOCS template and delivered 2026-08-07 →
Proposal_Skripsi_Efran_Nathanael.docx(link in §9). Uses real Word numbered lists and Heading 2/3 styles; printed Daftar Isi indexes only Bab headings (template TOC field is\o "1-1"); user must right-click → Update Field in Word for page numbers.
2. The paper in one paragraph
A controlled three-way comparison of player-state synchronization topologies in multi-server game networks: peer-to-peer pub/sub (LuckPerms = notify-then-read; LuckyCore = push-data over Redis pub/sub) versus master-slave gRPC streaming (NeoCore = authoritative master pushes over bidirectional streams). One fair measurement harness drives each system's real code under identical workload, clock, host, and MySQL. Six empirical metrics (propagation latency, staleness, update loss/recovery, throughput, overhead measured on BOTH network AND database, failure recovery) plus one analytical metric (attack surface = number of nodes holding store credentials: N / N / 1). Output = the latency–robustness–cost trade-off map, anchored by a neutral industry baseline.
Final titles.
- ID: STUDI KOMPARATIF TOPOLOGI SINKRONISASI STATE PEMAIN: PUB/SUB PEER-TO-PEER DAN gRPC STREAMING MASTER-SLAVE PADA JARINGAN GAME MULTI-SERVER
- EN: A COMPARATIVE STUDY ON PLAYER STATE SYNCHRONIZATION TOPOLOGIES: PEER-TO-PEER PUB/SUB VS. MASTER-SLAVE gRPC STREAMING IN MULTI-SERVER GAME NETWORKS
Research questions: RQ1 propagation latency P2P vs master-slave · RQ2 consistency & robustness (staleness, loss, recovery under node/broker/master failure) · RQ3 cost (throughput + network AND database overhead) · RQ4 attack surface (structural/analytical).
3. The three systems (all real, two are the author's own)
| LuckPerms | LuckyCore (LCore) | NeoCore | |
|---|---|---|---|
| Role | Industry-standard baseline (3rd party, neutral) | Author's production system (2020) | Author's successor system (2022) |
| Topology | Peer-to-peer | Peer-to-peer | Master-slave |
| Mechanism | Notify-then-read: Redis notification, receivers re-read shared DB | Push-data: change data broadcast over Redis pub/sub, fire-and-forget | Push-data: master persists then pushes over gRPC bidirectional stream (PubSubRPC), keepalive + reconnect |
| Store credentials | Every server (N) | Every server (N) | Master only (1); slaves (dataloader) hold none |
| Status | Actively maintained OSS | Ran in production at a large SEA Minecraft network (2020) | Reached staging, never production (author resigned before launch) |
Key architecture facts about NeoCore: ~12.5k LOC / 101 Java files, pure gRPC (zero Redis), 5 protos (NeoCore = PubSubRPC bidi + PlayerList; Logger; GlobalChat; PrivateChat; Commons), @RPCMessage/@RPCListener annotation API, MultiAddressNameResolverFactory client-side failover. It was forked from Atreus (the author's earlier gRPC permission-sync system) and still depends on Atreus at runtime for rank lookups (client-api 0.6, RPCServer.loadAtreus()). It also hard-depends on NovenaInjector (the author's ~180-line Java agent) to inject downloaded libs at startup (-javaagent). Do NOT call NeoCore "Atreus's successor" — say "the author's full-scale master-slave gRPC system".
4. Non-negotiable framing & honesty rules
- Topology-led, not transport-led. Transport (Redis vs gRPC) and topology (P2P vs master-slave) co-vary across the systems — a stated confound. The paper compares whole architectures; isolating one variable = future work. State this in Batasan and Threats to Validity.
- Security stays light. Attack surface is ONE analytical countable metric, not a threat model. The author is explicitly not comfortable defending deep cybersecurity framing; do not re-propose a security-led paper. Honesty caveat that must always accompany the attack-surface claim: NeoCore's transport today is plaintext gRPC with no authn/authz (and trusts a spoofable
requesterServerstring), so the delivered benefit is credential separation only; TLS/auth = future work. - Fair-comparison rule: all systems measured by ONE harness with pluggable propagation backends driving each system's REAL code (no reimplementation), same workload/clock/host/MySQL. LuckPerms runs in small real Bukkit servers; LuckyCore/NeoCore sync paths are extracted headless (disclose this asymmetry, and that LCoreBench is a faithful extraction because
RedisHandleris Bukkit-coupled). - Never fabricate results. Draft result sections use explicit placeholders. Report where NeoCore LOSES (it loses broadcast fan-out badly) as prominently as where it wins.
- The author's old "~5000 qps" recollection is unverified — never cite it; everything gets re-measured.
- RedisBungee is discontinued — don't cite as a live example.
5. Real results already measured (2026-08-07, on bench/instrumentation branch)
These exist but are deliberately NOT in the proposal (a proposal precedes results). Full write-up: findings-lcore-vs-neocore.md (§1–11).
- Fan-out collapse is the headline. NeoCore origin throughput for 5000-msg broadcast: ~44,646 msg/s at N=0 → ~2,120 at N=8 → ~1,412 msg/s at N=30 (~30x collapse, ~linear per receiver; master loops
onNextper observer). LuckyCore is FLAT in N (broker absorbs fan-out). Topology consequence, not transport. - Targeted sends INVERT it. NeoCore
sendMessage(msg, target): ~9–12k msg/s FLAT in fleet size; ~5.6x cheaper than its own broadcast at N=8. LuckyCore has no addressing (all subscribers receive everything, filter client-side, N−1 wasted deliveries). So master-slave wins targeted traffic as decisively as it loses broadcast → the honest bottom line is a mix-dependent crossover. - Bytes: per-message gRPC leaner (106 B vs 140 B), but broadcast origin sends N copies vs 1 → crossover at N=2; at N=16 it's 12x. A per-message-only comparison would conclude the opposite — call this out.
- Ordering: NeoCore 0 inversions (master serializes). LuckyCore 18/1225 pairs inverted, all in the first ~8 messages (cold-start of
RedisHandler's cached thread pool); steady state clean but unguaranteed. - Loss during disconnect: both lose everything (no buffering/replay in either). Difference: NeoCore NOTICES within ~5s (keepalive) and the slave refetches state on reconnect; LuckyCore neither notices nor recovers. Neither is a durable log — say so plainly.
- Backpressure CORRECTION (supersedes an earlier wrong claim): a stalled (SIGSTOPed) receiver gets EVICTED by the 5s keepalive cleaner → master memory stays flat (bounded; crude load shedding). The untested residual case: a receiver that keeps pinging but never drains (master never checks
isReady). - Implementation gap found in NeoCore: private chat uses
broadcastthough it targets one player on one server — textbook targeted case; one-line fix, ~5.6x effect at N=8. Frame as implementation gap, NOT topology limit. - Harness gotchas (hard-won): each simulated receiver MUST have its own gRPC
ManagedChannel(HTTP/2 multiplexing on a shared channel hides fan-out cost — measured FASTER, a trap); receivers must ping every ~2s or the master silently evicts them after 5 quiet seconds (report EFFECTIVE receiver counts); benchmark host must be quiet — valbox (load 13+, 12 cores) inflated p95/p50 ~19x, so real runs need a dedicated machine; record nproc + loadavg per run.
6. Instrumentation & harness (built, verified end-to-end)
- NeoCore side (branch
bench/instrumentation, commitd374e3d):BenchmarkHelper(master; tags msgsBENCH_ID+BENCH_SENT_ATviaSystem.nanoTime(), writes send CSV),BenchmarkCommand(benchmark start/run/stop),PubSubHelper.sendBenchmarkMessage()(bare tagged send),BenchmarkRecorder(client;-Dneocore.benchmark=<id>). Raw CSV; percentiles offline. Off by default. Two pre-existing NeoCore bugs found+fixed along the way (CLI command scan missed thedebugpackage; NPE on bare filename inFiles.createDirectories). - LuckyCore side:
harness/lcore/LCoreBench.java— faithful extraction (jedis 3.3.0 + gson 2.8.6 pinned to LCore's versions, same envelope{identifier, packetData}on channelLuckyCore, same cached-thread-pool async publish). Must be disclosed as an extraction. - CSV schema (both): sender
run_id,bench_id,action,receivers,sent_at; receiverclient,bench_id,action,sent_at,received_at,latency_ns; rows join onbench_id. - NeoCore build quirks: repoint dead
nexus.velocitypowered.com→repo.papermc.io; build:rpc:jarfirst;rpc-masterneedsVERSIONINFOresource; needs MySQL (LiteBans failure is non-fatal) and-javaagent:NovenaInjector.jar; master boots: "Listening on port 50051".
7. Remaining work (roughly in order)
- Real measurement runs on a QUIET host (cheap dedicated-vCPU VPS, <$1 total): latency distributions, ≥3 reps with variance, Method-A fan-out at 16/32.
- LuckPerms backend: small real Bukkit servers + LuckPerms Redis messenger, same CSV instrumentation (heaviest remaining harness work).
- Staleness + failure-injection experiments (kill broker/master/DB; disconnect/reconnect recovery timing). DB-overhead measurement (reads per propagation — LuckPerms shifts cost to DB).
- The "pings but never drains" backpressure edge case (needs a two-thread client).
- Write the Artikel Ilmiah into the IEEE conference A4 template (saved in
templates/conference-template-a4.docx); pick a target conference (needs acceptance for an A).
8. Working conventions (matter for any generated output)
- No AI attribution anywhere in the thesis artifacts: commits authored as "Efran Nathanael" with no co-author trailer; generated code must match house style (
@UtilityClass, GsonJsonObject, switch-arrow, sparse comments) and not read as AI-written. - Proposal/deskripsi field has a hard <1000-char cap (final desc = 954 chars, in proposal-fields.md).
- Mermaid on the x056 renderer: plain ASCII only, no semicolons in diagram text (breaks rendering).
- The author prefers ADHD-friendly communication: lead with the action/answer, numbered steps, short lists, one next action.
- Obscura (employer's DMS) was rejected as a thesis artifact over AI-authorship/IP concerns — do not resurrect it.
9. All project links (x056.think.val.id)
| Document | Link |
|---|---|
| Proposal skripsi (.docx, filled BINUS template) | https://x056.think.val.id/Proposal_Skripsi_Efran_Nathanael.docx |
| This brief | https://x056.think.val.id/claude-projects-brief.md |
| Proposal form fields (titles, desc, RQ, batasan — FINAL) | https://x056.think.val.id/proposal-fields.md |
| System design (3 architectures, diagrams, audit findings §7–10) | https://x056.think.val.id/system-design.md |
| Harness design (pluggable backends, instrumentation, lessons) | https://x056.think.val.id/harness-design.md |
| Roadmap (Tracks A–F, progress, risks) | https://x056.think.val.id/roadmap.md |
| Paper skeleton (IEEE-shaped draft, placeholder results) | https://x056.think.val.id/artikel-ilmiah-draft.md |
| Measured findings §1–11 (the real data) | https://x056.think.val.id/findings-lcore-vs-neocore.md |
| Harness README (how to run both benches) | https://x056.think.val.id/README.md |
| Threat model (de-scoped; reference only for the attack-surface metric) | https://x056.think.val.id/threat-model.md |
Local working tree (not reachable from Claude Projects): /home/efran/remote-development/atreus-lcore-paper/ (docs + harness + templates), /home/efran/remote-development/NeoCore (branch bench/instrumentation), LuckyCore & repos via SSH key as BadAccuracyID (public API 404s the private repos).