شرط بندی فوتبال : اجاره


سایت شرط بندی فوتبال
بهترین سایت شرط بندی
سایت شرط بندی معتبر فوتبال

گره خوشه ای می تواند برای مدت زمان محدودی اجاره بخواهد و پس از آن منقضی می شود. اگر بخواهد دسترسی را گسترش دهد ، گره می تواند قبل از انقضا قرارداد اجاره را تمدید کند. مکانیزم اجاره را با استفاده از هسته سازگار برای تحمل خطا و ثبات. ارزش “زمان زندگی” مرتبط با اجاره نامه داشته باشید. گره های خوشه ای می توانند کلیدهایی را در یک هسته سازگار با اجاره نامه متصل به آن ایجاد کنند. اجاره نامه ها با رهبر و پیروان برای تحمل خطا. این مسئولیت گره متعلق به اجاره نامه است که به صورت دوره ای آن را تازه کند.
تپش قلب توسط مشتریان برای تازه سازی زمان ارزش زندگی در هسته ثابت استفاده می شود. اجاره ها در تمام گره های موجود در هسته سازگار، اما فقط رهبر مهلت زمانی اجاره را پیگیری می کند. وقفه ها از طریق دنبال کنندگان در هسته سازگار دنبال نمی شوند. این کار به این دلیل انجام می شود که ما به رهبر نیاز داریم که با استفاده از ساعت یکنواخت خود در مورد زمان انقضا قرارداد اجاره تصمیم بگیرد و سپس به منقضی شدن منقضی قرارداد اجاره نامه را به پیروان اطلاع دهید. این اطمینان می دهد که ، مانند هر تصمیم دیگری در هسته سازگار، گره ها نیز در مورد انقضا اجاره به اتفاق نظر می رسند.

هنگامی که یک گره از یک هسته ثابت به یک رهبر تبدیل می شود ، شروع به ردیابی اجاره ها می کند.

کلاس ReplicatedKVStore

  public void onBecomingLeader() {
      leaseTracker = new LeaderLeaseTracker(this, new SystemClock(), server);
      leaseTracker.start();
  }

رهبر یک کار برنامه ریزی شده را شروع می کند تا دوره ای مدت انقضا اجاره را بررسی کند

کلاس LeaderLeaseTracker

  private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
  private ScheduledFuture<?> scheduledTask;
  @Override
  public void start() {
      scheduledTask = executor.scheduleWithFixedDelay(this::checkAndExpireLeases,
              leaseCheckingInterval,
              leaseCheckingInterval,
              TimeUnit.MILLISECONDS);

  }

  @Override
  public void checkAndExpireLeases() {
      remove(expiredLeases());
  }

  private void remove(Stream<String> expiredLeases) {
      expiredLeases.forEach((leaseId)->{
          //remove it from this server so that it doesnt cause trigger again.
          expireLease(leaseId);
          //submit a request so that followers know about expired leases
          submitExpireLeaseRequest(leaseId);
      });
  }

  private Stream<String> expiredLeases() {
      long now = System.nanoTime();
      Map<String, Lease> leases = kvStore.getLeases();
      return  leases.keySet().stream()
              .filter(leaseId -> {
          Lease lease = leases.get(leaseId);
          return lease.getExpiresAt() < now;
      });
  }

پیروان ردیاب اجاره بدون عملیات را شروع می کنند.

کلاس ReplicatedKVStore

  public void onCandidateOrFollower() {
      if (leaseTracker != null) {
          leaseTracker.stop();
      }
      leaseTracker = new FollowerLeaseTracker(this, leases);
  }

اجاره نامه به شرح زیر ارائه می شود:

public class Lease implements Logging {
    String name;
    long ttl;
    //Time at which this lease expires
    long expiresAt;

    //The keys from kv store attached with this lease
    List<String> attachedKeys = new ArrayList<>();

    public Lease(String name, long ttl, long now) {
        this.name = name;
        this.ttl = ttl;
        this.expiresAt = now + ttl;
    }

    public String getName() {
        return name;
    }

    public long getTtl() {
        return ttl;
    }

    public long getExpiresAt() {
        return expiresAt;
    }

    public void refresh(long now) {
        expiresAt = now + ttl;
        getLogger().info("Refreshing lease " + name + " Expiration time is " + expiresAt);
    }

    public void attachKey(String key) {
        attachedKeys.add(key);
    }

    public List<String> getAttachedKeys() {
        return attachedKeys;
    }
}

وقتی گره ای می خواهد اجاره نامه ایجاد کند ، با رهبر ارتباط برقرار می کند هسته سازگار و درخواست ایجاد اجاره نامه را ارسال می کند. درخواست اجاره ثبت همانند سایر درخواستهای موجود در نسخه تکرار و رسیدگی می شود هسته سازگار. درخواست فقط درصورت تکمیل شدن مارک پر آب به نمایه ورود به سیستم ورود به سیستم در ورودی تکرار شده می رسد.

کلاس ReplicatedKVStore

  private ConcurrentHashMap<String, Lease> leases = new ConcurrentHashMap<>();
@Override
public CompletableFuture<Response> registerLease(String name, long ttl) {
    if (leaseExists(name)) {
        return CompletableFuture
                .completedFuture(
                        Response.error(Errors.DUPLICATE_LEASE_ERROR,
                            "Lease with name " + name + " already exists"));
    }
    return server.propose(new RegisterLeaseCommand(name, ttl));
}

private boolean leaseExists(String name) {
    return leases.containsKey(name);
}

نکته مهمی که باید به آن توجه کنید این است که برای ثبت نام اجاره المثنی کجا اعتبار سنجی کنید. بررسی آن قبل از پیشنهاد درخواست کافی نیست ، زیرا چندین درخواست در پرواز وجود دارد. بنابراین سرور همچنین در صورت ثبت اجاره نامه پس از تکثیر موفقیت آمیز ، نسخه های کپی را بررسی می کند.

کلاس LeaderLeaseTracker

  private Map<String, Lease> leases;
  @Override
  public void addLease(String name, long ttl) throws DuplicateLeaseException {
      if (leases.get(name) != null) {
          throw new DuplicateLeaseException(name);
      }
      Lease lease = new Lease(name, ttl, clock.nanoTime());
      leases.put(name, lease);
  }

شکل 1: ثبت اجاره نامه

گره مسئول اجاره به رهبر متصل می شود و قبل از انقضا مدت اجاره را تازه می کند. همانطور که در تپش قلب، لازم است زمان سفر رفت و برگشت شبکه را در نظر بگیرد تا در مورد ارزش “زمان زندگی” تصمیم بگیرد و قبل از انقضا مدت اجاره نامه درخواستهای تازه ارسال کند. گره می تواند چندین بار درخواست بازخوانی را در بازه زمانی “زمان ترک” ارسال کند تا اطمینان حاصل شود که در صورت بروز هرگونه مشکل اجاره نامه تازه می شود. اما گره همچنین باید مطمئن شود که تعداد زیادی درخواست تازه سازی ارسال نشده است. منطقی است که پس از سپری شدن نیمی از زمان اجاره ، درخواست ارسال کنید. این منجر به حداکثر دو درخواست تازه سازی در زمان اجاره می شود. گره مشتری زمان را با ساعت یکنواخت خود ردیابی می کند.

کلاس LeaderLeaseTracker

  @Override
  public void refreshLease(String name) {
      Lease lease = leases.get(name);
      lease.refresh(clock.nanoTime());
  }

درخواست های تازه سازی فقط به رهبر هسته سازگار ارسال می شود ، زیرا فقط رهبر مسئول تصمیم گیری در مورد انقضا قرارداد اجاره نامه است.

شکل 2: تجدید اجاره نامه

وقتی قرارداد اجاره منقضی شد ، از رهبر حذف می شود. همچنین تعهد این اطلاعات به هسته سازگار. بنابراین رهبر درخواستی برای انقضا مدت اجاره نامه ارسال می کند ، که مانند سایر درخواست ها در رسیدگی می شود هسته سازگار. از وقتی که مارک پر آب به درخواست اجاره منقضی شده پیشنهاد می رسد ، از همه دنبال کنندگان حذف می شود.

کلاس LeaderLeaseTracker

  public void expireLease(String name) {
      getLogger().info("Expiring lease " + name);
      Lease removedLease = leases.remove(name);
      removeAttachedKeys(removedLease);
  }

شکل 3: انقضا اجاره

پیوستن اجاره نامه به کلیدهای موجود در مقدار ذخیره کلید

یک خوشه باید بداند که یکی از گره های آن خراب است. می تواند این کار را با اجاره دادن گره از Consistent Core انجام دهد و سپس آن را به یک کلید شناسایی خود متصل کند که در هسته سازگار ذخیره می کند. اگر گره خوشه در حال اجرا است ، باید قرارداد را در فواصل منظم تمدید کند. در صورت انقضا قرارداد اجاره ، کلیدهای مرتبط حذف می شوند. هنگامی که کلید برداشته می شود ، رویدادی که نشان دهنده خرابی گره است به گره خوشه مورد علاقه ارسال می شود همانطور که در مورد بحث شده است سازمان دیده بان الگو.

گره خوشه با استفاده از هسته سازگار ، با برقراری تماس شبکه مانند موارد زیر اجاره نامه ایجاد می کند:

consistentCoreClient.registerLease("server1Lease", TimeUnit.SECONDS.toNanos(5));

سپس می تواند این اجاره نامه را به کلید شناسایی خود که در هسته سازگار ذخیره می کند ضمیمه کند.

consistentCoreClient.setValue("/servers/1", "{address:192.168.199.10, port:8000}", "server1Lease");

هنگامی که Consistent Core پیام ذخیره کلید را در ذخیره مقدار کلید خود دریافت می کند ، کلید مورد اجاره مشخص را نیز ضمیمه می کند.

کلاس ReplicatedKVStore

  private ConcurrentHashMap<String, Lease> leases = new ConcurrentHashMap<>();

کلاس ReplicatedKVStore

  private Response applySetValueCommand(Long walEntryId, SetValueCommand setValueCommand) {
      getLogger().info("Setting key value " + setValueCommand);
      if (setValueCommand.hasLease()) {
          Lease lease = leases.get(setValueCommand.getAttachedLease());
          if (lease == null) {
              //The lease to attach is not available with the Consistent Core
              return Response.error(Errors.NO_LEASE_ERROR,
                      "No lease exists with name "
                              + setValueCommand.getAttachedLease());
          }

          lease.attachKey(setValueCommand.getKey());

      }
      kv.put(setValueCommand.getKey(), new StoredValue(setValueCommand.getValue(), walEntryId));

با انقضا قرارداد اجاره ، Consistent Core همچنین کلیدهای پیوست شده را از ذخیره ارزش کلیدی خود حذف می کند.

کلاس LeaderLeaseTracker

  public void expireLease(String name) {
      getLogger().info("Expiring lease " + name);
      Lease removedLease = leases.remove(name);
      removeAttachedKeys(removedLease);
  }
private void removeAttachedKeys(Lease removedLease) {
    if (removedLease == null) {
        return;
    }
    List<String> attachedKeys = removedLease.getAttachedKeys();
    for (String attachedKey : attachedKeys) {
        getLogger().trace("Removing " + attachedKey + " with lease " + removedLease);
        kvStore.remove(attachedKey);
    }
}


سایت شرط بندی
سایت پیشبینی
سایت شرط بندی معتبر

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *