31 Ağustos 2023 Perşembe

HazelcastAPI MapStoreAdapter Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.map.MapStoreAdapter;
Kalıtım şöyle
MapLoader
  MapStore
    MapStoreAdapter

Yani default metodlar sunan bir MapStore

Örnek
Şöyle yaparız
import com.hazelcast.map.MapStoreAdapter;

public static class SimpleMapStore<K, V> extends MapStoreAdapter<K, V> {
  ...
}

SimpleMapStore store = new SimpleMapStore();

new MapStoreConfig()
  .setEnabled(true)
  .setImplementation(store);
Örnek - Store Olarak ConcurrentHashMap 
Şöyle yaparız
MapStoreConfig mapStoreConfig = new MapStoreConfig();
mapStoreConfig.setEnabled(true);
mapStoreConfig.setInitialLoadMode(MapStoreConfig.InitialLoadMode.EAGER);

ConcurrentHashMap store = new ConcurrentHashMap<>();
mapStoreConfig.setImplementation(new MapStoreAdapter<Integer, Integer>() {

  @Override
  public Integer load(Integer key) {
    return store.get(key);
  }

  @Override
  public void store(Integer key, Integer value) {
    store.put(key, value);
   }
});
String slowMapName = "slowMap";
config.getMapConfig(slowMapName).setMapStoreConfig(mapStoreConfig);

28 Ağustos 2023 Pazartesi

Hazelcast Jet Sources.socket metodu

Giriş
TCP sunucusuna bağlanır. String okur. StreamSocketP nesnesi yaratır

socket - Host + Port 
İmzası şöyle
public static StreamSource<String> socket(String host, int port)
socket - Host + Port + Charset
İmzası şöyle
public static StreamSource<String> socket(String host, int port, Charset charset)
Örnek
Şöyle yaparız
StreamSource<String> source = Sources.socket("localhost", 8080, StandardCharsets.UTF_8);

27 Ağustos 2023 Pazar

HazelcastAPI MetricsCollectionCycle Arayüzü

Giriş
Şu satırı dahil ederiz 
import com.hazelcast.internal.metrics.impl.MetricsCollectionCycle;
İçinde bir tane MetricsCollector arayüzü var. Bu arayüzün kalıtımı şöyle
MetricsCollector
  ClientMetricCollector
  CompositeMetricsCollector
  JobMetricsCollector
  MetricsCollectorImpl
  PublisherMetricsCollector

Hazelcast SQL - File İçin CREATE MAPPING Örnekleri

Örnek
Şöyle yaparız
CREATE OR REPLACE MAPPING fileMapping
TYPE File
OPTIONS (
 'format' = 'csv',
 'glob' = 'myfile',
 'path' = '/myhome/' -- The file must be available on all cluster members.
);


25 Ağustos 2023 Cuma

HazelcastDocker

hazelcast-docker Projesi
Docker image üreten proje burada


Diğer
DockerHub'taki projeler şöyle

1. hazelcast-oss
hazelcast-oss dizinindeki Dockerfile dosyasında alpine:3.18.0 görülebilir. Bu versiyon sonra değişecektir. 

2. hazelcast-enterprise 
hazelcast-enterprise dizinindeki Dockerfile dosyasında redhat/ubi8-minimal:8.8 görülebilir. Bu versiyon sonra değişecektir. Yeni paketler kurulurken Java 11 (java-11-openjdk-headless) de kuruluyor


3. .github Dizini
scheduled_vulnerability_scan.yaml dosyası
Kod şöyle. Zafiyet Taraması (Vulnerability scan) yapılacak sürümleri gösterir.
jobs:
    trigger-vulnerability-scan:
        name: Scan ${{ matrix.ref }}
        strategy:
            fail-fast: false
            matrix:
                ref: [ 'master', '5.3.z', '5.2.z', '5.1.z', '5.0.z', '4.2.z' ]
        uses: ./.github/workflows/vulnerability_scan_subworkflow.yml
        with:
            ref: ${{ matrix.ref }}
        secrets:
            SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
ee-nlc-tag-push.yml
QEMU kuruluyor. Kod şöyle
- name: Set up QEMU
  uses: docker/setup-qemu-action@v2.2.0

- name:  Set up Docker Buildx
  uses: docker/setup-buildx-action@v2.2.1
  with:
    version: v0.5.1
amd64 ve arm için 2 tane image yapılandırılıyor. Kod şöyle
- name: Build EE image
  run: |
    docker build \
      --build-arg HZ_VERSION=${RELEASE_VERSION} \
      --build-arg HAZELCAST_ZIP_URL=${HAZELCAST_ZIP_URL} \
      --tag hazelcast-nlc:test hazelcast-enterprise

...

- name: Build/Push EE image
  run: |
   docker buildx build --push \
     --build-arg HZ_VERSION=${RELEASE_VERSION} \
     --build-arg HAZELCAST_ZIP_URL=${HAZELCAST_ZIP_URL} \
     --tag ${NLC_IMAGE_NAME}:${RELEASE_VERSION}  \
     --platform=linux/arm64,linux/amd64 hazelcast-enterprise


Hazelcast Jet CreateJobPlan Sınıfı - Execution Engine

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.sql.impl.SqlPlanImpl;
CreateJobPlan sınıfı SqlPlanImpl içinde. Kod şöyle
static class CreateJobPlan extends SqlPlanImpl {
  private final JobConfig jobConfig;
  private final boolean ifNotExists;
  private final DmlPlan dmlPlan;
  private final String query;
  private final boolean infiniteRows;
  private final PlanExecutor planExecutor;
  ...
}
infiniteRows Stream Job olduğunu belirtir

Hazelcast Jet TopicsConfig Sınıfı - Topic partition İçin Properties Sağlar

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.kafka.TopicsConfig;
addTopicConfig metodu
Örnek
Şöyle yaparız
String topicName = ...;
TopicsConfig topicsConfig = new TopicsConfig()
topicsConfig.addTopicConfig(new TopicConfig(topicName));
Örnek
Şöyle yaparız
TopicsConfig topicsConfig = new TopicsConfig()
  .addTopicConfig(new TopicConfig(topic1Name)
    // 20 total records will be skipped from topic1
    .addPartitionInitialOffset(0, 5L)
    .addPartitionInitialOffset(1, 5L)
    .addPartitionInitialOffset(2, 5L)
    .addPartitionInitialOffset(3, 5L))
  .addTopicConfig(new TopicConfig(topic2Name)
    // 10 total records will be skipped from topic2
    .addPartitionInitialOffset(0, 5L)
    .addPartitionInitialOffset(2, 5L))

23 Ağustos 2023 Çarşamba

Graceful Shutdown

Giriş
Şöyle tetiklenir
HazelcastInstance instance = ...;
instance.shutdown();
Açıklaması şöyle. Yani metod hemen sonlanmaz.
When you gracefully shutdown first node, shutdown process should wait (block) until data is safely backed up.
Açıklaması şöyle. MigrationManager devreye girer.
This means that it notifies master member, master member rebalances partitions, data are migrated off the shutting-down member, then it shuts down.
Açıklaması şöyle
When a member is being gracefully shut down, its partitions are migrated to other members. While partitions are migrating, the partition table still lists the shutting-down member as partition owner. So:
  • read only operations (e.g. map.get) are served normally by the shutting-down member
  • mutating operations (e.g. map.put but also others, including all EntryProcessor - related ops) fail with a PartitionMigratingException. This exception is retryable, so it is not immediately propagated to the user. Instead, internally Hazelcast retries for a certain count of retries (default is 250). If an invocation is retried for 100 times or more, then we log at WARNING level something like Retrying invocation: …, Reason: …
Once migrations are done, partition assignments table is updated and the partition invocation is retried on the new owner of the partition and should be executed successfully.
The operation will fail terminally (i.e. propagate an exception to the caller) if:
  • retry limit (default 250) is reached
  • operation call timeout is exceeded (not sure if this is 60 or 120 seconds)
That said, can you provide more details what is the expected behaviour and what is their observation?
MigrationListener İle İlişkisi
İşlem başlatılınca MigrationListener tetiklenir
Açıklaması şöyle
it only triggers when a node joins or leaves "gracefully", it doesn't trigger when a node leaves "ungracefully".

21 Ağustos 2023 Pazartesi

Hazelcast SQL JavaCC

Giriş
SQL Parser kodları JavaCC ile üretiliyor. yacc gibidir. Belirtilen dosyadaki kurallara göre bir parser üretir

maven plugin kodu şöyle
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>javacc-maven-plugin</artifactId>
  <version>2.4</version>
  <executions>
    <execution>
      <id>javacc</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>javacc</goal>
      </goals>
      <configuration>
        <sourceDirectory>${project.build.directory}/generated-sources/</sourceDirectory>
        <includes>
          <include>**/Parser.jj</include>
        </includes>
        <!-- This must be kept synced with Apache Calcite. -->
        <lookAhead>1</lookAhead>
        <isStatic>false</isStatic>
        <outputDirectory>${project.build.directory}/generated-sources/java/</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

hazelcast-sql/src/main/codegen/config.fmpp ve dosyalarında özelleştirme kodları var




16 Ağustos 2023 Çarşamba

Hazelcast Jet IMapSqlConnector Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.sql.impl.connector.map.IMapSqlConnector;
Açıklaması şöyle
IMapSqlConnector is used when you create a mapping on top of a map.
CREATE MAPPING ... Type IMAP cümlesi sonucunda bu connector yaratılır

Hazelcast Jet KafkaSqlConnector Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.sql.impl.connector.kafka.KafkaSqlConnector;
CREATE MAPPING ... Type Kafka cümlesi sonucunda bu connector yaratılır. Burada preferred local parallellism için bir soru var

HazelcastAPI MetricsRegistry Arayüzü

Giriş
Şu satırı dahil ederiz 
import com.hazelcast.internal.metrics.MetricsRegistry;
Kalıtım şöyle
MetricsRegistry
  MetricsRegistryImpl

collect metodu
İmzası şöyle
void collect(MetricsCollector collector);
scheduleAtFixedRate metodu
İmzası şöyle. Bir publisher eklenir
ScheduledFuture<?> scheduleAtFixedRate(Runnable publisher, long period, 
  TimeUnit timeUnit, ProbeLevel probeLevel);
Örnek
Şöyle yaparız
MetricsRegistry metricsRegistry = this.nodeEngine.getMetricsRegistry();
metricsRegistry.scheduleAtFixedRate(new PublishNodeMetricsTask(), metricsPeriod, SECONDS, 
  ProbeLevel.INFO);

Hazelcast SQL - HZ İçin CREATE DATA CONNECTION Örnekleri

Örnek
Şöyle yaparız
CREATE DATA CONNECTION "my-hazelcast-cluster"
TYPE Hz
SHARED
OPTIONS (
    'client_xml'= 
    '<?xml version="1.0" encoding="UTF-8"?> 
     <hazelcast-client xmlns="http://www.hazelcast.com/schema/client-config"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.hazelcast.com/schema/client-config
         http://www.hazelcast.com/schema/client-config/hazelcast-client-config-5.3.xsd">

       <cluster-name>dev</cluster-name>
       <network>
         <cluster-members>
	   <address>172.17.0.2:5701</address>
         </cluster-members>
       </network>
      </hazelcast-client>'
);

15 Ağustos 2023 Salı

Hazelcast Jet Sources.jmsQueue metodu

Giriş
İmzası şöyle. jakarta.jms.ConnectionFactory arayüzünü gerçekleştiren bir sınıf bekliyor.
public static StreamSource<Message> jmsQueue(String name, 
  SupplierEx<? extends ConnectionFactory> factorySupplier);
JMS bağlantısının kurulabilmesi için şu yöntemlerden birisini yapmak gerekir

1. Member Class Path'e JMS client bağımlılığı eklenir.
Açıklaması şöyle
To use a JMS broker, such as ActiveMQ, you need the client libraries on your members' classpath.
Örneğin
Şöyle member'daki pom.xml dosyasında şöyle yaparız
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-client-jakarta</artifactId>
  <version>5.18.2</version>
</dependency>
2. JobConfig nesnesine addJar() çağrısı ile gerekli client jar'ları eklenir. 
Bu yöntemi burada gördüm. Ama bence iyi bir çözüm değil

Örnek
Şöyle yapmak gerekir
jobConfig.addJar("artemis-jakarta-client-all-2.30.0.jar");

Kullanım
Örnek - Artemis
Şöyle yaparız
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;

Pipeline pipeline = Pipeline.create();
pipeline.readFrom(Sources.jmsQueue("JCG_QUEUE",
  () -> new ActiveMQConnectionFactory("tcp://activemq:61616")))
  .withoutTimestamps()
  .writeTo(Sinks.logger()
);

Çalışmak Maven Profile

1. Etkin/Seçili Gelenler
default, jdk-17, modulepath-tests, not-quick, protoc-supported, spring-5. 
LOCAL profile etkin gelmiyor ama seçmek lazım yoksa unit testler çalışmıyor.

- LOCAL Profile
Unit testlerde logger çıktısını konsolda gösterir

- not-quick Profile
Extension projeleri de yapılandırmak için gerekir. Eğer bazı extension projeleri ve distribution projesini hariç bırakmak istersek şöyle yaparız
mvn install -DskipTests -pl -distribution,-extensions/hadoop-dist -f pom.xml

2. Seçilebilenler

- quick profile
Amacı : skip all tests, javadoc , source jars ve checkstyle. Yani javadoc üretmiyor
Örnek
mvn clean install -Pquick
Bence şununla benzer
mvn clean install -DskipTests -Dcheckstyle.skip

3. Benim Kullandıklarım
Örnek - Yerel Depoya Kurulum Yapmak
Değişiklikleri maven deposuna kurmak için şöyle yaparız
mvn install -DskipTests
Örnek - IntelliJ İçinden Testleri Çalıştırmak
IntelliJ içinden tüm testleri çalıştırmak için Maven penceresinde Execute Maven Goal için şöyle yaparız. Bu MAC üzerinde çalışıyor. Tüm testleri koşturur ve hata varsa da devam eder. 
Not : Toggle 'Skip Tests' Mode gri renk olmamalı. MAC'te şöyle
mvn test -Dmaven.test.failure.ignore=true
Windows'ta şöyle
mvn test -D"maven.test.failure.ignore=true"
Örnek
Şöyle yaparız. Tek thread ile testleri çalıştırır
mvn -T1 clean install -U -B 
  -DfailIfNoTests=false
  "-Dmaven.test.failure.ignore=true"
  -DvmHeapSettings="-Xms8g -Xmx8g" 
  -DextraVmArgs="-Djava.net.preferIPv4Stack=true"
Testler çalışırken jps ile surefire process numarasına bakarız. Sonra şöyle yaparız
watch -n1 "lsof -p 1790 | wc -l"
Örnek
Şöyle yaparız. parallelTest profile testleri çalıştırır
--no-transfer-progress : İndirilen dosyalar için ilerleme bilgisi göstermez
-B : batch mode anlamına gelir. maven soru sormaz, varsayılan değerler ile devam eder
-Dskip-modulepath-tests : Java 9 module testlerini es geçer
mvn -e --no-transfer-progress -B install
  "-Dcheckstyle.skip=true" 
  "-Dskip-modulepath-tests" 
  "-Dmaven.test.failure.ignore=true" 
  "-Dbuildtime.output.log=true" 
  -DvmHeapSettings="-Xms8g -Xmx8g" 
  "-DextraVmArgs=-XX:+HeapDumpOnOutOfMemoryError" 
  -PparallelTest \
  -Ppr-builder
Tek satır hali şöyle
mvn -e --no-transfer-progress -B install "-Dcheckstyle.skip=true" "-Dskip-modulepath-tests" "-Dmaven.test.failure.ignore=true" "-Dbuildtime.output.log=true" -DvmHeapSettings="-Xms8g -Xmx8g" "-DextraVmArgs=-XX:+HeapDumpOnOutOfMemoryError" -PparallelTest -Ppr-builder





14 Ağustos 2023 Pazartesi

Hazelcast Jet JdbcDataConnectionRegistration Sınıfı

Giriş
Şu satırı dahil ederiz 
import com.hazelcast.dataconnection.impl.JdbcDataConnectionRegistration;
Kalıtım şöyle
DataConnectionRegistration
  JdbcDataConnectionRegistration

public class JdbcDataConnectionRegistration implements DataConnectionRegistration {

  @Override
  public String type() {
    return "JDBC";
  }

  @Override
  public Class<? extends DataConnection> clazz() {
    return JdbcDataConnection.class;
  }
}
hazelcast/src/main/resources/META-INF/services/com.hazelcast.dataconnection.DataConnectionRegistration dosyasında Service örüntüsü ile yükleniyor. Dosyanın için şöyle
com.hazelcast.dataconnection.impl.JdbcDataConnectionRegistration
com.hazelcast.dataconnection.impl.HazelcastDataConnectionRegistration

Hazelcast Jet DataConnectionResource Sınıfı - Bu Nesne İçin CREATE MAPPING Yapılabilir

Giriş
Şu satırı dahil ederiz 
import com.hazelcast.dataconnection.DataConnectionResource;
DataConnectionResource sadece type + String[] alır.  Kod şöyle
public class DataConnectionResource {
  private final String type;
  private final String[] name;
  ...
}

HazelcastAPI AuditlogConfig Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.config.SecurityConfig;
setEnabled metodu
Şöyle yaparız
Config config = ...
config.getAuditlogConfig().setEnabled(true);

11 Ağustos 2023 Cuma

HazelcastAPI ClientCloudConfig Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.client.config.ClientCloudConfig;
setDiscoveryToken metodu
Örnek
Şöyle yaparız
ClientCloudConfig originalConfig = new ClientCloudConfig().setEnabled(true)
  .setDiscoveryToken("pAB2kwCdHKbGpFBNd9iO9AmnYBiQa7rz8yfGW25iHEHRvoRWSN");

ClientNetworkConfig clientNetworkConfig = clientConfig.getNetworkConfig();
clientNetworkConfig.setCloudConfig(originalConfig);


9 Ağustos 2023 Çarşamba

HazelcastSpring HazelcastTransactionManager Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.spring.transaction.HazelcastTransactionManager;
Burada bu sınıf ile ilgili bir yazı var. Bu sınıf Spring'in PlatformTransactionManager arayüzünden kalıtır. 
Kalıtım şöyle
org.springframework.transaction.PlatformTransactionManager
  org.springframework.transaction.support.AbstractPlatformTransactionManager
  org.springframework.transaction.support.ResourceTransactionManager
    HazelcastTransactionManager

Böylece sanırım Spring içindeki @Transaction anotasyonları ile Hazelcast nesneler üzerindeki işlemlerde transactional hale geliyor.

    

Hazelcast SQL JdbcTable Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.jet.sql.impl.connector.jdbc.JdbcTable;
Bir JDBC tablosunu temsil eder. JdbcSqlConnector tarafından yaratılır.

Kalıtım şöyle
Table
  JetTable
    JdbcTable

getFields metodu
Bu metod Table sınıfndan geliyor. Kod şöyle
public abstract class Table {
  ...
  private List<TableField> fields;
  ...
}
Ama aslında fields alanıa JdbcTableField tipindendir. "CREATE MAPPING ..." ile belirtilen alanları aynı sırada içerir.

4 Ağustos 2023 Cuma

HazelcastAPI HazelcastJsonValue Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.core.HazelcastJsonValue;
Açıklaması şöyle
Using HazelcastJsonValue means we are still storing data as JSON-formatted Strings.

constructor - Json String
Örnek
Şöyle yaparız
String person1 = "{ \"name\": \"John\", \"age\": 35 }";
String person2 = "{ \"name\": \"Jane\", \"age\": 24 }";
String person3 = "{ \"name\": \"Trey\", \"age\": 17 }";
String person4 = "{ \"name\": \"Phil\", \"age\": 30 }";
String person5 = "{ \"name\": \"May\"}";

IMap<Integer, HazelcastJsonValue> idPersonMap = instance.getMap("jsonValues");

idPersonMap.put(1, new HazelcastJsonValue(person1));
idPersonMap.put(2, new HazelcastJsonValue(person2));
idPersonMap.put(3, new HazelcastJsonValue(person3));
idPersonMap.put(4, new HazelcastJsonValue(person4));
idPersonMap.put(5, new HazelcastJsonValue(person4));



2 Ağustos 2023 Çarşamba

HazelcastAPI NearCache Arayüzü

Giriş
Şu satırı dahil ederiz
import com.hazelcast.internal.nearcache.impl.NearCache;
Kalıtım şöyle
NearCache
  DefaultNearCache

Near-Cache Nedir?
Açıklaması şöyle. Near-Cache hem client hem de member tarafından kullanılabilir
Hazelcast has a useful feature called near-cache. Basically, it allows each application node to hold a local copy of the remote cached object (e.g. Map) without the pain of managing the relationship between the local object and the remote one.

It saves the network latency and the serialization/deserialization processing in read operations.
Bir başka açıklama şöyle
When an application request data from the cache, it first looks for the data in the near-cache. If it doesn’t find the data, we call it a cache miss. In this case, the data is requested from the remote cache cluster and added to the near-cache. When the application wants to read this data again, it can find it in the near-cache. We call this a cache hit.

Şeklen şöyle





getNearCacheStats metodu
NearCacheStats nesnesi döner



THIRD-PARTY.txt Dosyası

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