Skip to main content

Real-time application in order to dominate Humans.

Project description

Domination

Real-time application made to monitor and dominate Humans.

From the rating of every human (from 1 to 100) sent to the kafka topic dominate, we detect, in real time, which type they are:

  • Sha if its rating is a multiple of 3
  • Dow if its rating is a multiple of 5
  • ShaDow if its rating is a multiple of 3 and 5
  • Incompatible if none of the above.

Using a new kafka topic shadow, we make the result available to a clickhouse table named shadow.

System Design

+----------------+               +-------------+            +------------------+
|  domination    |               |  dominate   |            | domination       |
+----------------+               +-------------+            +------------------+
| python         | +-----------> |             | +--------> | python           |
| Faust producer |               | Kafka topic |            | Faust agent      |
| HumanRatings   |               |             |            | HumanCategorized |
+----------------+               +-------------+            +------------------+
                                                                      +
      +---------------------------------------------------------------+
      v
+----------------+           +-------------------+           +-------------------+
|  shadow        |           | shadow_stream     |           |  shadow_consumer  |
+----------------+           +-------------------+           +-------------------+
|                | +------>  | clickhouse table  | +------>  | clickhouse table  |
|  Kafka topic   |           | encapsulate topic |           | materialized view |
+----------------+           +-------------------+           +-------------------+
                                                                      +
      +---------------------------------------------------------------+
      v
+-------------------+
|  shadow           |
+-------------------+
| clickhouse table  |
| store rows        |
+-------------------+

Structure of Kafka messages:

  • topic dominate: {"rating": <integer>, "unique_id": "<string>"}

  • topic shadow: {"type": <integer>, "unique_id": "<string>", "emit_timestamp": <datetime>}

Usage

Requirements

  • Python >= 3.6
  • docker-compose

Start domination

git clone https://github.com/AzemaBaptiste/domination.git && cd domination
virtualenv -p python3.8 venv && source venv/bin/activate
pip install domination
docker-compose up -d
./create_clickhouse_tables.sh

domination worker -l info

Explore data in a new terminal

docker exec -it clickhouse bin/bash -c "clickhouse-client --multiline"
   > SELECT COUNT(type) AS COUNT, type FROM shadow 
     GROUP BY type ORDER BY (COUNT) DESC LIMIT 10;

Stop domination

Ctrl + C (stop faust app)
docker-compose down

Run The Algorithm

You can also run The Algorithm as a standalone. It will print the type of every human rated from 1 to 1337.

python the_algorithm.py 

Development

# Install
virtualenv -p python3.8 venv
source venv/bin/activate
pip install -r requirements.txt
make install

# Build
make test # coverage tests
make linter # runs pylint
make build

Explore data

Open CLI of the clickhouse client

docker exec -it clickhouse bin/bash -c "clickhouse-client --multiline"

Description of clickhouse tables

shadow_stream: consumer of the kafka topic
CREATE TABLE IF NOT EXISTS shadow_stream
(
    `type` String,
    `unique_id` String,
    `emit_timestamp` DateTime
) ENGINE = Kafka()
  SETTINGS
    kafka_broker_list = 'kafka:29092',
    kafka_topic_list = 'shadow',
    kafka_group_name = 'shadow-group',
    kafka_format = 'JSONEachRow',
    kafka_skip_broken_messages = 1;
shadow: final table
CREATE TABLE shadow as shadow_stream
ENGINE = MergeTree()
PARTITION BY toYYYYMM(emit_timestamp)
ORDER BY type;
shadow_consumer: materialized view feeding the final table with the consumer table
CREATE MATERIALIZED VIEW shadow_consumer 
TO shadow
AS SELECT * FROM shadow_stream;

References

TODO

  • deploy package to pypi using github actions

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

domination-1.2.tar.gz (4.6 kB view details)

Uploaded Source

Built Distribution

domination-1.2-py3.8.egg (8.0 kB view details)

Uploaded Source

File details

Details for the file domination-1.2.tar.gz.

File metadata

  • Download URL: domination-1.2.tar.gz
  • Upload date:
  • Size: 4.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.8.5

File hashes

Hashes for domination-1.2.tar.gz
Algorithm Hash digest
SHA256 7f7ccb098b27abdedb31ee57a62e3ba31b26e9e20cc551d14244e865ec6e7ef6
MD5 cdee5365f047203613aace8968322b3d
BLAKE2b-256 f564fbbbf6fa56f37bc02f53b01e3d9be3280bb77de006a646531554a6b94eeb

See more details on using hashes here.

File details

Details for the file domination-1.2-py3.8.egg.

File metadata

  • Download URL: domination-1.2-py3.8.egg
  • Upload date:
  • Size: 8.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.8.5

File hashes

Hashes for domination-1.2-py3.8.egg
Algorithm Hash digest
SHA256 59d4f3b797d0b7ad3bb0c866ec9432b0287b74b80988aa7b6bcc57201a70561e
MD5 955f77cfce8f7d6c5d15ec5816eb084e
BLAKE2b-256 4d837ee47be3872f83438f4fb42c51e71bddce6cdd8918af785c6ca036dfd230

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page