Upgrade to Pro — share decks privately, control downloads, hide ads and more …

System design on practice

System design on practice

Explained how to build simple distributed system. Discus about consistency problem, and posable solutions.

Dmitrii Rygalov

April 04, 2019
Tweet

More Decks by Dmitrii Rygalov

Other Decks in Education

Transcript

  1. © 2019 True Engineering. All rights reserved. Engineering True …….

    True_мастер-класс System design на практике
  2. 1. Масштаб проекта 2. Время 3. Экономическая эффективность 4. UX

    и поддержка 5. Удобство эксплуатации 6. Надёжность 7. Масштабируемость 8. Целостность данных Факторы, которые влияют на архитектуру
  3. Поводы для беспокойства Distributed systems concerns Config management Service Discovery

    & LB Service Security API Management Resilience & Fault Tolerance Centralized Logging Centralized Metrics Scheduling & Deployment Auto Scaling & Self Healing Distributed Tracing
  4. Добавляем Kubernetes Distributed systems concerns Config management Service Discovery &

    LB Service Security API Management Resilience & Fault Tolerance Centralized Logging Centralized Metrics Scheduling & Deployment Auto Scaling & Self Healing Distributed Tracing
  5. @RestController("/") public class LotteryController { private LotteryService lotteryService; @GetMapping(“/node/data") public

    NumbersDto getNodeData() { return lotteryService.getNodeData(number); } @GetMapping("/node/status") public NodeStatusDto getNodeStatus() { return lotteryService.getNodeStatus(); } @PostMapping("/openRegistration") public void openRegistration() { lotteryService.openRegistration(); } @PostMapping("/closeRegistration") public void closeRegistration() { lotteryService.closeRegistration(); } } Админка
  6. void openRegistration() { asyncDataHolder.getIsRegistrationInProgress().set(true); restTemplate.get(registrationServiceAddress + "/startLottery"); registeredUsersService.getAllRegisteredUsers(); } void

    closeRegistration() { asyncDataHolder.getIsRegistrationInProgress().set(false); restTemplate.get(registrationServiceAddress + “/stopLottery"); } NodeStatusDto getNodeStatus() { return restTemplate.get(nodeUrl + "/status"); } NumbersDto getNodeData() { return restTemplate.get(nodeUrl + "/all"); } Админка
  7. @Async public void getAllRegisteredUsers() { while (asyncDataHolder.getIsRegistrationInProgress().get()) { Integer[] numbers

    = restTemplate.getForObject(registrationServiceAddress + "/getNumbers"); for (Integer number : numbers) { restTemplate.getForObject(pushNodeUrl + "/add/" + number); } } } Админка
  8. public class RandomizerController { public static void main(arg []) {

    RandomizerService service = new RandomizerServiceImpl(numbers); get("/all", (req, res) -> service.getAll()); get("/status", (req, res) -> service.getStatus()); get("/add/:number", (req, res) -> service.put(req.params(“number"))); get("/winner", (req, res) -> service.winner()); } } Рандомайзер
  9. public class RandomizerServiceImpl implements RandomizerService { private final Set<String> numbers;

    public One put(String number) { numbers.add(number); return new One(number); } public One winner() { int i = new Random().nextInt(numbers.size()); return new One(numbers.get(i)); } public Status getStatus() { return new Status(numbers.size()); } public Data getAll() { return new Data(numbers); } } Рандомайзер
  10. apiVersion: apps/v1 kind: StatefulSet metadata: name: demo spec: replicas: 1

    spec: containers: - name: demo-service image: mityi/sample-hz-arm:0.0.1 Рандомайзер
  11. @GetMapping("/node/{number}/data") public NumbersDto getNodeData(@PathVariable Node number) { return lotteryService.getNodeData(number); }

    @GetMapping("/node/{number}/status") public NodeStatusDto getNodeStatus(@PathVariable Node number) { return lotteryService.getNodeStatus(number); } switch (node) { case FIRST: url = firstNodeUrl; break; case SECOND: url = secondNodeUrl; break; } Админка
  12. apiVersion: apps/v1 kind: StatefulSet metadata: name: demo spec: replicas: 2

    spec: containers: - name: demo-service image: mityi/sample-hz-arm:0.0.1 Рандомайзер
  13. Sharding + Replication Решение Node 1 Owner Backup Node 2

    Owner Backup Node 3 Owner Backup Application Partition 1 Partition 2 Partition 3 Overall data
  14. public class RandomizerServiceImpl implements RandomizerService - private final Set<String> numbers;

    + private final HazelcastSet<String> numbers; // public One put(String number) // public One winner() // public Status getStatus() // public Data getAll() Рандомайзер