Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aorwall/evactor
Complex event processor based on Akka
https://github.com/aorwall/evactor
akka scala
Last synced: 10 days ago
JSON representation
Complex event processor based on Akka
- Host: GitHub
- URL: https://github.com/aorwall/evactor
- Owner: aorwall
- Created: 2011-09-14T17:52:25.000Z (about 13 years ago)
- Default Branch: master
- Last Pushed: 2013-10-11T14:52:33.000Z (about 11 years ago)
- Last Synced: 2024-10-10T23:33:36.472Z (27 days ago)
- Topics: akka, scala
- Language: Scala
- Homepage:
- Size: 1.79 MB
- Stars: 29
- Watchers: 7
- Forks: 10
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Evactor
=====================
***Check out the [example](https://github.com/aorwall/evactor-twitter) module to get a better understanding on how all this works.***This is an attempt to create a complex event processing implementation in Akka. The idea is that *processors* subscribe to *channels* to receive *events* published on the channels. The event processor can then process the events in some way and publish new events on other event channels.
The project also houses a storage solution, based on Apache Cassandra, for auditing and statistics. An API exists for easy access to historic data.
Flow
---------------------### Event
*TODO*### Collector
A *collector* collects events from external event producers.### Processor
A processor is a component that performs operations on events. This could be to extract data, create new events based on aggregated events or examining a collection of events to find a particular pattern.To receive events the processor subscribes to channels or to all events that flows through the system. When the processor creates a new event it can publish it to another channel.
### Channel
*TODO*Configuration
---------------------
Everything is configured in the `application.conf` file.### Collectors
*TODO*### Processors
#### Routers
Handles routing in the system##### Forwarder
Just forwarding an event to a different channel (and category)###### Configuration
```text
forwarderName {
type = forwarder
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
}
```##### Filter
Filtering out events that doesn't comply with a specified rule(expression)###### Configuration
```text
filterName {
type = filter
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
expression = { mvel = "value > 0" }
accept = false
}
```#### Analysers
Analysing sequences of events and produces new events with the result##### Count analyser
Counts events within a specified time frame###### Configuration
```text
filterName {
type = countAnalyser
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
categorize = true
timeframe = 2 hours
}
```
##### Average analyser
Count average in a specified window (time or length)###### Configuration
```text
averageAnalyserName {
type = averageAnalyser
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
categorize = false
expression = { static = "foo" }
window = { time = 1 minute }
}
```
##### Regression analyser
Calculates the regression coefficient within a specified time frame###### Configuration
```text
regressionName {
type = regressionAnalyser
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
categorize = true
minSize = 25
timeframe = 15 minutes
}
```#### Alerter
Alerts when events that doesn't comply with a specified rule(expression) and informs when state is back to normal.```text
type = alerter
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
categorize = false
expression = { mvel = "true" }
```#### Builders
*TODO*#### Producers
Produces events to external consumers.##### LogProducers
Writes events to log.###### Configuration
```text
logger {
type = logProducer
subscriptions = [ {channel = "foo"} ]
loglevel = INFO
}
```#### Custom processor
It's possible to create a custom processor and use it in the configuration by specifying the class instead of *type*.##### Configuration
```text
customProcessor {
class = org.example.CustomProcessor
subscriptions = [ {channel = "foo"} ]
publication = { channel = "bar" }
arguments = ["foo", "bar"]
}
```##### Example implementation
```scalaclass SimpleProcessor (
override val subscriptions: List[Subscription],
val publication: Publication)
extends Processor(subscriptions) with Publisher {def process(event: Event) {
// do stuffpublish(event)
}
}```
Storage
---------------------
*TODO*API
---------------------
*TODO*Build and deploy
---------------------
*TODO*Licence
---------------------
Copyright 2012 Albert ÖrwallLicensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0