Jadi, Anda ingin mengoptimalkan gRPC. Bagian 2

Untuk calon siswa pada kursus "Java Developer. Basic" kami menyiapkan terjemahan artikel.



Kami juga mengundang semua orang ke webinar terbuka untuk kursus ini, di mana para peserta, bersama dengan guru, akan menganalisis cara kerja Internet.






gRPC? , , . , 60%. , 10 000%. 





, "-" Java. , , , . , .





KvService. RPC, , , . synchronized, , RPC:





private final Map<ByteBuffer, ByteBuffer> store = new HashMap<>();

@Override
public synchronized void create(
    CreateRequest request, StreamObserver<CreateResponse> responseObserver) {
  ByteBuffer key = request.getKey().asReadOnlyByteBuffer();
  ByteBuffer value = request.getValue().asReadOnlyByteBuffer();
  simulateWork(WRITE_DELAY_MILLIS);
  if (store.putIfAbsent(key, value) == null) {
    responseObserver.onNext(CreateResponse.getDefaultInstance());
    responseObserver.onCompleted();
    return;
  }
  responseObserver.onError(Status.ALREADY_EXISTS.asRuntimeException());
}
      
      



, : RPC! , . .





, RPC. , RPC, . ยซ-ยป , . "foo", "bar". , . , .





, . synchronized



Java , KvService. create



. Map. HashMap , , HashMap . synchronized



.





Java : ConcurrentHashMap



. Map. , . , , . putIfAbsent



, , , , .





ConcurrentMap



putIfAbsent



, HashMap



ConcurrentHashMap



synchronized



:





private final ConcurrentMap<ByteBuffer, ByteBuffer> store = new ConcurrentHashMap<>();

@Override
public void create(
    CreateRequest request, StreamObserver<CreateResponse> responseObserver) {
  ByteBuffer key = request.getKey().asReadOnlyByteBuffer();
  ByteBuffer value = request.getValue().asReadOnlyByteBuffer();
  simulateWork(WRITE_DELAY_MILLIS);
  if (store.putIfAbsent(key, value) == null) {
    responseObserver.onNext(CreateResponse.getDefaultInstance());
    responseObserver.onCompleted();
    return;
  }
  responseObserver.onError(Status.ALREADY_EXISTS.asRuntimeException());
}
      
      



create



. retrieve



delete



. update



. , :





@Override
public synchronized void update(
    UpdateRequest request, StreamObserver<UpdateResponse> responseObserver) {
  ByteBuffer key = request.getKey().asReadOnlyByteBuffer();
  ByteBuffer newValue = request.getValue().asReadOnlyByteBuffer();
  simulateWork(WRITE_DELAY_MILLIS);
  ByteBuffer oldValue = store.get(key);
  if (oldValue == null) {
    responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
    return;
  }
  store.replace(key, oldValue, newValue);
  responseObserver.onNext(UpdateResponse.getDefaultInstance());
  responseObserver.onCompleted();
}
      
      



store



:





  1. .





  2. .





, ConcurrentMap



. , Map, . , , , .





, , replace



. replace



true



, . (ConcurrentMap



, , , !) do-while



:





@Override
public void update(
    UpdateRequest request, StreamObserver<UpdateResponse> responseObserver) {
  // ...
  ByteBuffer oldValue;
  do {
    oldValue = store.get(key);
    if (oldValue == null) {
      responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
      return;
    }
  } while (!store.replace(key, oldValue, newValue));
  responseObserver.onNext(UpdateResponse.getDefaultInstance());
  responseObserver.onCompleted();
}
      
      



, RPC store.get()



store.replace()



, . , . .





, : RPC . , API, . , , .





, ListenableFuture



. 100 RPC. , โ€” . , . RPC , , . , :





:





$ ./gradlew installDist
$ time ./build/install/kvstore/bin/kvstore
Apr 16, 2018 10:38:42 AM io.grpc.examples.KvRunner runClient
INFO: Did 24.067 RPCs/s

real	1m0.886s
user	0m9.340s
sys	0m1.660s
      
      



:





Apr 16, 2018 10:36:48 AM io.grpc.examples.KvRunner runClient
INFO: Did 2,449.8 RPCs/s

real	1m0.968s
user	0m52.184s
sys	0m20.692s
      
      



! 24 RPC , 2400. API, . API. ยซ-ยป, , .





user



. 9 , 9 60 . 5 , 52 . , . KvServer , . , - . RPC, . , 12 , 12- . !





, :





Apr 16, 2018 10:38:40 AM io.grpc.examples.KvClient$3 onFailure
INFO: Key not found
io.grpc.StatusRuntimeException: NOT_FOUND
      
      



, . 100 RPC, . , API. , , .





gRPC-. , . , . .






"Java Developer. Basic".





ยซ ยป.








All Articles