Streaming components in Scala for building Microservices, Event Sourcing, Event Logging, CQRS, and Reactive systems. Functions and pre-built stream stages for Akka Streams, HTTP, Actors, Kafka, Cassandra, Algebird, and Avro. The ACK in a SMACK stack
It's meant to be used as
- a more adaptable alternative to frameworks and products
- examples for learning how to use these components and work with streams
- templates for other components or custom alternatives
- is in your product
This Readme covers download, setup and configuration, unit and integration testing and adding it to your project. Documentation is on the website, Scaladocs have examples and lower level descriptions.
Add dependency in build.sbt
libraryDependencies += "com.github.garyaiki" % "dendrites_2.12" % "0.6.3"
Add dependency in pom.xml
`<!-- https://mvnrepository.com/artifact/com.github.garyaiki/dendrites_2.12 -->
<dependency>
<groupId>com.github.garyaiki</groupId>
<artifactId>dendrites_2.12</artifactId>
<version>0.6.3</version>
</dependency>`
Requires Java 8 download jdk8 and Scala 2.12 download scala. Clone or download dendrites from Github, see cloning-a-repository
sbt version, download, documentation
In a terminal window cd
to the dendrites directory.
$ sbt
launch sbt, returns >
prompt
> help
list available help
> update
Resolves and optionally retrieves dependencies.
> clean
Deletes files produced by the build under target
directory
> compile
Compiles sources under src/main/scala
> test:compile
Compiles unit test sources under src/test/scala
> it:compile
Compiles integration test sources under src/it/scala
> test
Executes unit tests.
> testOnly
Executes specific unit tests
> testQuick
Re-executes failed unit tests
> package
Produces the jar.
> doc
Generates Scaladocs in /dendrites/target/scala-2.12/api
> scalastyle
Run scalastyle on source code under src/main/scala
> test:scalastyle
Run scalastyle on source code under src/test/scala
> dependencyTree
Prints an ascii tree of all the dependencies to the console
> exit
quit sbt
In a terminal window cd
to the dendrites directory.
$ mvn dependency:resolve
Resolves and optionally retrieves dependencies.
$ mvn clean
Deletes files produced by the build under target
directory
$ mvn compile
Compiles sources under src/main/scala
$ mvn scala:testCompile
Compiles unit test sources under src/test/scala
$ mvn test
Executes unit tests.
$ mvn install
Install the package in local repository, for use as in other projects locally.
$ mvn source:jar
Bundle the main sources of the project into a jar archive.
$ mvn scala:doc-jar
Generate Scaladocs in a jar
Minimal install and configure for running dendrites integration tests. Kafka's documentation, download Kafka
Extract server files tar -xvf kafka_2.12-1.0.*.*.tar
Optionally, create or replace symbolic link ln -nsf kafka_2.12-1.0.*.* kafka
Edit configuration in install directory /config/server.properties
To advertise the broker in a local install. In Socket Server Settings
add
listeners=PLAINTEXT://localhost:9092
In production, log retention hours are 168 (1 week). For development you can shorten them to 1. In Log Retention Policy
log.retention.hours=1
Add dependencies to driver jars. sbt and Maven dependency settings. See kafka-clients Maven repository page
Put a Consumer Config properties file on your classpath. See Kafka's New Consumer Configs documentation and a dendrites example. KafkaSource requires enable.auto.commit=false
for stream backpressure to control commit. To pass this configuration to KafkaSource, create a subclass of ConsumerConfig. example
Put a Producer Config properties file on your classpath. See Kafka's Producer Configs documentation example To pass this configuration to KafkaSink, create a subclass of ProducerConfig example
In a Terminal window cd
to kafka install directory
bin/zookeeper-server-start.sh config/zookeeper.properties
Zookeeper will run in the foreground
In a 2nd Terminal window in the same directory
bin/kafka-server-start.sh config/server.properties
Kafka server will run in the foreground
In a 3rd Terminal window in the same directory
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic account-topic
This takes a few seconds.
Kafka server must be running and have an account-topic
In dendrites directory terminal window with sbt running
> it:compile
> it:testOnly com.github.garyaiki.dendrites.kafka.KafkaProducerConsumerSpec
> it:testOnly com.github.garyaiki.dendrites.kafka.AvroKafkaProducerConsumerSpec
> it:testOnly com.github.garyaiki.dendrites.kafka.stream.KafkaStreamSpec
Note: KafkaStreamSpec, ShoppingCartCmdSpec creates KafkaConsumer in KafkaSource. KafkaConsumer calls must all be from the same thread. KafkaSource doesn't close KafkaConsumer until the stream it's in completes. To re-run one of these tests, exit and restart sbt.
List topics
bin/kafka-topics.sh --zookeeper localhost:2181 --list
Delete topic, this may not happen right away. The topic _consumerOffsets
can't be deleted from the command line. Kafka Tool is a GUI tool and free for personal use.
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic account-topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic shoppingcartcmd-topic
it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.ShoppingCartCmdSpec
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic shoppingcartcmd-topic
After topic deleted, stop Kafka server
bin/kafka-server-stop.sh
Give Zookeeper a few seconds. Then stop it too
bin/zookeeper-server-stop.sh
Minimal install and configure for running dendrites integration tests, Cassandra's documentation, download Cassandra
Extract files tar -xvf apache-cassandra-3.11.*-bin.tar
Optionally, create or replace symbolic link ln -nsf apache-cassandra-3.11.* cassandra
For development, default configuration can be used.
Add dependencies to cassandra-driver-core
, cassandra-driver-mapping
, cassandra-driver-extras
. Driver jars with sbt and Maven dependency settings. See Datastax Cassandra Maven repository page
dendrites has an example Cassandra configuration in resource.conf
under dendrites/cassandra
. You can override these in your application.conf
file. CassandraConfig is a trait you can extend. PlayListSongConfig is an example.
In a Terminal window cd
to cassandra install directory
bin/cassandra -f
It will run in the foreground
In a dendrites directory terminal window with sbt running. These tests teardown their keyspaces, tables, and connections, run them one at a time so ScalaTest doesn't mix them up and report false errors.
> it:compile
> it:testOnly com.github.garyaiki.dendrites.cassandra.BoundStmtSpec
> it:testOnly com.github.garyaiki.dendrites.cassandra.stream.CassandraSongSpec
> it:testOnly com.github.garyaiki.dendrites.cassandra.stream.CassandraPlaylistSpec
> it:testOnly com.github.garyaiki.dendrites.cassandra.stream.CassandraSpec
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cassandra.stream.CassandraShoppingCartSpec
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cassandra.stream.CassandraShoppingCartCmdSpec
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cassandra.stream.CassandraShoppingCartEvtLogSpec
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cmd.stream.ShoppingCartCmdAndEvtSinkSpec
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cmd.stream.ShoppingCartCmdAndEvtSinksSpec
With Kafka shoppingcartcmd-topic
> it:testOnly com.github.garyaiki.dendrites.examples.cqrs.shoppingcart.cmd.stream.ShoppingCartCmdAndEvtSpec
Exit sbt to close its connection to Cassandra. If you kill Cassandra while sbt is still it will keep trying to reconnect to Cassandra.
Then, Ctrl-C
in the terminal running Cassandra
Balances Server
is an example server that handles requests from integration tests under src/it/scala
These integration tests need Balances Server running to handle HTTP requests.
> bgRun
Runs Balances Server
an Http server in the background
In the dendrites directory terminal with sbt running
> it:compile
> it:testOnly com.github.garyaiki.dendrites.http.stream.TypedQueryResponseFlowSpec
> it:testOnly com.github.garyaiki.dendrites.examples.account.http.*
Sometimes, some of these tests fail because Balances Server has a default limit of 4 concurrent requests and tests are running in parallel and may not get time on the server. If this happens, re-run the failed tests one at a time.
Ctrl-C
in the terminal window running Balances Server
dendrites uses Typesafe Config. Traits with names ending in Config
define configuration properties for components. This mediates configuration from usage, so you may use these traits with different configuration sources.
Typesafe Config user guide, Akka config user guide
Configurations in /src/main/resources/reference.conf
can be overridden by your application.conf
.
The akka
section is for logging and has Akka specific logging settings
Under the dendrites
section
algebird
has default settings for CountMinSketch, DecayedValue, HyperLogLog, and QTree
blocking-dispatcher
configures a thread pool to be used when there are blocking calls
checking-balances
, money-market-balances
, and savings-balances
are example http client configurations
kafka
is an example topic and timeout configuration
cassandra
is an example cluster and keyspace configuration
timer
is asychronous and exponential backoff timeout configuration
Logging configuration for running tests and integration tests is in /src/test/resources/logback.xml
Your application Logback configuration is done separately. You can copy logback.xml paste it into your /src/main/resources/
and modify it.