public CompletableFuture<Void> replicateBlob(String blobId, String serviceId, DataNodeId sourceDataNode) {
    CompletableFuture<Void> future = new CompletableFuture<>();
    replicateBlob(blobId, serviceId, sourceDataNode, CallbackUtils.fromCompletableFuture(future));
    return future;
  }
Requests for a blob to be replicated asynchronously and returns a future that will eventually contain information
about whether the request succeeded or not.
@param blobId The ID of the blob to be replicated.
@param serviceId The service ID of the service replicating the blob. This can be null if unknown.
@param sourceDataNode The source {@link DataNodeId} to get the blob from.
@return A future that would contain information about whether the replicateBlob succeeded or not, eventually.
ambry-router/src/main/java/com/github/ambry/router/NonBlockingRouter.java