29 Kasım 2023 Çarşamba

ProcessorMetaSupplier.Context Arayüzü

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.core.ProcessorMetaSupplier.Context;
Bu arayüz ProcessorMetaSupplier nesnesinin init() metoduna parametre olarak geçilir. Böylece ProcessorMetaSupplier nesnesi bazı ortam değişkenlerine erişebilir. 

Metodlar şöyle
HazelcastInstance hazelcastInstance();
JetInstance jetInstance();
long jobId();
long executionId();
JobConfig jobConfig();
int totalParallelism();
int localParallelism();
int memberCount();
String vertexName();
ILogger logger();
boolean snapshottingEnabled();
ProcessingGuarantee processingGuarantee();
long maxProcessorAccumulatedRecords();
boolean isLightJob();
Map<Address, int[]> partitionAssignment();
ClassLoader classLoader();
DataConnectionService dataConnectionService();
void checkPermission(@Nonnull Permission permission)


SchedLock

Giriş
Önemli sınıflar şöyle
1. HazelcastLockProvider
2. HazelcastLock

HazelcastLockProvider Sınıfı
lock metodu
Kod şöyle
public Optional<SimpleLock> lock(@NonNull LockConfiguration lockConfiguration) {

  final Instant now = ClockProvider.now();
  final String lockName = lockConfiguration.getName();
  final IMap<String, HazelcastLock> store = getStore();
  try {
    // lock the map key entry
    store.lock(lockName, keyLockTime(lockConfiguration), TimeUnit.MILLISECONDS);
    // just one thread at a time, in the cluster, can run this code
    // each thread waits until the lock to be unlock
    if (tryLock(lockConfiguration, now)) {
      return Optional.of(new HazelcastSimpleLock(this, lockConfiguration));
    }
  } finally {
    // released the map lock for the others threads
    store.unlock(lockName);
  }
  return Optional.empty();
}
  1. shedlock_storage isimli IMap veri yapısında HazelcastLock nesneleri saklanır. 
  2. eyLockTime() metodu now + LockAtMostUntil değerini verir. Yani IMap.lock() çağrısı gelecekteki bir zaman kadar bu key değerini kilitler
  3. tryLock() metodu kilitli olan key değerinde 
    1. HazelcastLock nesnesi yoksa yeni bir tane ekler ve true döner
    2.  HazelcastLock nesnesi varsa ve bayatlamışsa, yeni HazelcastLock  ile değiştirir ve true döner
    3. HazelcastLock nesnesi varsa ve bayatlamamışsa, kilitleyemediği için false döner





28 Kasım 2023 Salı

hazelcast.xml Cache Ayarları

Örnek
Şöyle yaparız
<cache name="*">
  <statistics-enabled>false</statistics-enabled>
  <management-enabled>false</management-enabled>
  <in-memory-format>BINARY</in-memory-format>
  <expiry-policy-factory>
    <timed-expiry-policy-factory expiry-policy-type="ETERNAL"/>
  </expiry-policy-factory>
  <eviction eviction-policy="LRU" max-size-policy="ENTRY_COUNT" size="10000"/>
</cache>

hazelcast.xml - Advanced Network Ayarları

Giriş
Network Join Ayarları yazısına bakabilirsiniz


Örnek
Şöyle yaparız
<advanced-network enabled="true">
  <join>
    <auto-detection enabled="false"/>
    <multicast enabled="true">
      <multicast-group>224.2.2.3</multicast-group>
      <multicast-port>54327</multicast-port>
      <multicast-time-to-live>32</multicast-time-to-live>
      <multicast-timeout-seconds>5</multicast-timeout-seconds>
    </multicast>
  </join>

  <member-server-socket-endpoint-config>
    <port>5701</port>
    <socket-options>
      <keep-alive>true</keep-alive>
      <tcp-no-delay>true</tcp-no-delay>
      <buffer-direct>true</buffer-direct>
    </socket-options>
  </member-server-socket-endpoint-config>
  <client-server-socket-endpoint-config>
    <port>9090</port>
    <socket-options>
    <keep-alive>true</keep-alive>
    <tcp-no-delay>true</tcp-no-delay>
    <buffer-direct>true</buffer-direct>
    </socket-options>
  </client-server-socket-endpoint-config>
</advanced-network>

21 Kasım 2023 Salı

HazelcastAPI AbstractRecordStore Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.map.impl.AbstractRecordStore;
Kodu şöyle
abstract class AbstractRecordStore implements RecordStore<Record> {
  protected final int partitionId;
  protected final String name;
  protected final LockStore lockStore;
  protected final MapContainer mapContainer;
  protected final RecordFactory recordFactory;
  protected final InMemoryFormat inMemoryFormat;
  protected final MapStoreContext mapStoreContext;
  protected final ValueComparator valueComparator;
  protected final MapServiceContext mapServiceContext;
  protected final MapDataStore<Data, Object> mapDataStore;
  protected final SerializationService serializationService;
  protected final CompositeMutationObserver<Record> mutationObserver;
  protected final LocalRecordStoreStatsImpl stats = new LocalRecordStoreStatsImpl();
  protected Storage<Data, Record> storage;
  protected IndexingMutationObserver<Record> indexingObserver;
  ...
}
storage Alanı
protected Storage<Data, Record> storage
 alanı sanırım veriyi saklayan yapı

mapDataStore Alanı
MapDataStore<Data, Object> mapDataStore alanı write-throughwrite-behind işlemlerini gerçekleştiren arayüz. WriteThroughStore yazısına bakabilirsiniz.

MapDataStore (WriteThroughStore) -> has MapStoreWrapper 
MapStoreWrapper -> has MapLoader or MapStore 

20 Kasım 2023 Pazartesi

IdentifiedDataSerializable Serialization

Giriş
Açıklaması şöyle
IdentifiedDataSerializable extends DataSerializable and introduces the following methods:
  int getClassId();
  int getFactoryId();

IdentifiedDataSerializable uses getClassId() instead of class name and it uses getFactoryId() to load the class when given the id. 

To complete the implementation, you should also implement
com.hazelcast.nio.serialization.DataSerializableFactory and register it into SerializationConfig, which can be accessed from Config.getSerializationConfig()

Factory’s responsibility is to return an instance of the right IdentifiedDataSerializable object, given the id. 

1 Kasım 2023 Çarşamba

Stream-to-Batch Join

Giriş
Join işlemi iki farklı başlık altında ele alınabilir

Stream-to-Batch Join
Kafka ve JDBC tabloları arasındaki join

Batch-to-Batch Join
JDBC tabloları arasındaki join

1. Stream-to-Batch Join
Apache Calcite bir şekilde JDBC  tarafında kullanılacak indeksleri bulamıyor. hazelcast-sql modülündeki JetJoinInfo sınıfının hem leftEquiJoinIndices hem de rightEquiJoinIndices dizisi boş geliyor. Yani JDBC tarafında hangi sütunlar için WHERE koşulu çalıştırılacağını bulamıyoruz. Bu yüzden JDBC tablosu için
SELECT column1, column2 FROM mytable;
şeklinde bir sorgu çalıştırılıyor.  
- SELECT bölümündeki çekilecek sütunlar listesi List<RexNode> projection değişkeninden geliyor. Aslında SELECT * yapılsa da olurdu
- Tüm JDBC tablosu üzerinde yürüyerek sol taraftaki satır ile sağ taraftaki satırın belirtilen koşula uyup uymadığı kontrol ediliyor. Yani aslında FullScan yapılıyor. 

2. Batch-to-Batch Join
Apache Calcite bir şekilde sağ taraftaki JDBC tablosunda kullanılacak indeksleri buluyor. JetJoinInfo sınıfının rightEquiJoinIndices dizisi dolu geliyor. Bu durumda sağ tabloda hangi sütunlar için WHERE koşulu çalıştırılacağını bulabiliyoruz. Bu yüzden JDBC tablosu için
SELECT colum1, colum2 FROM mytable WHERE colum1 = ? AND column2 = ?;
şeklinde bir sorgu çalıştırılıyor. 
- SELECT bölümündeki çekilecek sütunlar listesi List<RexNode> projection değişkeninden geliyor. 
- WHERE bölümündeki değişkenler listesi rightEquiJoinIndices değişkeninden geliyor. 
- Satırları sorgulama aşamasında yani PreparedStatement ile sorgularken soru işaretlerinin yerine de sol taraftan gelen satırdaki değerler bağlanıyor. Yani bir  anlamda IndexScan yapılıyor. 


THIRD-PARTY.txt Dosyası

Kullanılan harici kütüphanelerin sürümleri bu dosyada Dosyanın yolu şöyle hazelcast/licenses/THIRD-PARTY.txt