Я использую Beam-SDK версии 2.9 в моем потоке данных.
и вызвать службу в потоке данных.
регион dataflow и datastore (firestore режима хранилища данных) 'Токио.
Я пытаюсь получить доступ к хранилищу данных в службе.
получать данные с помощью Pk очень медленно. И при выполнении процесса данных нет.
время получения: 60 мс
положить время: 12 мс
время фиксации: 77мс
Я пытался использовать одноэлементный объект для доступа к хранилищу данных. ничего не изменилось.
1) datastore access code
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
public Map<String, Object> get(List pklist, Object lifetime) {
String key = pklist.toString();
Key pk = keyFactory.newKey(key);
Entity entity = ThreadLocalTransaction.getThreadInstance().getTxn().get(pk);
if (entity != null) {
KryoSerializer ser = new KryoSerializer(HashMap.class);
Map<String, Object> valueMap = ser.deserialize(entity.getBlob(VALUE).toByteArray());
String lifetimeValue = entity.getString(LIFETIME);
if (ObjectUtils.equals(ObjectUtils.toString(lifetime), lifetimeValue)) {
return valueMap;
}
}
return null;
}
public void put(List pklist, Object lifetime, Map<String, Object> value) {
String key = pklist.toString();
Key pk = keyFactory.newKey(key);
KryoSerializer ser = new KryoSerializer(HashMap.class);
byte[] bytes = ser.serialize(value);
Entity entity = Entity.newBuilder(pk)
.set(VALUE,
BlobValue.newBuilder(Blob.copyFrom(bytes)).setExcludeFromIndexes(true).build())
.set(LIFETIME, StringValue.of(ObjectUtils.toString(lifetime)))
.set(TIMESTAMP, Timestamp.now())
.build();
ThreadLocalTransaction.getThreadInstance().getTxn().put(entity);
}
2) the main code
ThreadLocalTransaction.getThreadInstance().setTxn(datastore.newTransaction());
get();
put();
ThreadLocalTransaction.getThreadInstance().getTxn().commit();
3) pom
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>1.56.0</version>
</dependency>