.. _quickstart:

============================================================
  Quick Start
============================================================

.. contents::
    :local:
    :depth: 2

Hello World
===========

Application
-----------

The first thing you need to get up and running with Faust is to define
an application.

The application (or app for short) configures your project and implements
common functionality. We also define a topic description, and an agent
to process messages in that topic.

Lets create the file `hello_world.py`:

.. sourcecode:: python

    import faust

    app = faust.App(
        'hello-world',
        broker='kafka://localhost:9092',
        value_serializer='raw',
    )

    greetings_topic = app.topic('greetings')

    @app.agent(greetings_topic)
    async def greet(greetings):
        async for greeting in greetings:
            print(greeting)

In this tutorial, we keep everything in a single module, but for larger
projects, you can create a dedicated package with a submodule layout.

The first argument passed to the app is the ``id`` of the application, needed
for internal bookkeeping and to distribute work among worker instances.

By default Faust will use JSON serialization, so we specify ``value_serializer``
here as ``raw`` to avoid deserializing incoming greetings.  For real
applications you should define models (see :ref:`guide-models`).

Here you defined a Kafka topic ``greetings`` and then an agent that
iterates over the messages in the topic and prints each one of them.

.. note::

    The application :setting:`id` setting (i.e. ``'hello-world'`` in
    the example above), should be unique per Faust app in your Kafka
    cluster.


Starting Kafka
--------------

Before running your app, you need to start Zookeeper and Kafka.

Start Zookeeper first:

.. sourcecode:: console

    $ $KAFKA_HOME/bin/zookeeper-server-start $KAFKA_HOME/etc/kafka/zookeeper.properties

Then start Kafka:

.. sourcecode:: console

    $ $KAFKA_HOME/bin/kafka-server-start $KAFKA_HOME/etc/kafka/server.properties

Running the Faust worker
------------------------

Now that you have created a simple Faust application and have Kafka and
Zookeeper running, you need to run a worker instance for the application.

Start a worker:

.. sourcecode:: console

    $ faust -A hello_world worker -l info

Multiple instances of a Faust worker can be started independently to distribute
stream processing across machines and CPU cores.

In production, you'll want to run the worker in the
background as a daemon. Use the tools provided
by your platform, or use something like `supervisord`_.

Use ``--help`` to get a complete listing of available command-line options:

.. sourcecode:: console

    $ faust worker --help

.. _`supervisord`: http://supervisord.org

Seeing things in Action
-----------------------

At this point, you have an application running, but not much is happening.
You need to feed data into the Kafka topic to see Faust print the greetings
as it processes the stream, and right now that topic is probably empty.

Let's use the :program:`faust send` command to push some messages into the
``greetings`` topic:

.. sourcecode:: console

    $ faust -A hello_world send @greet "Hello Faust"

The above command sends a message to the ``greet`` agent by using the ``@``
prefix. If you don't use the prefix, it will be treated as the name of a topic:

.. sourcecode:: console

    $ faust -A hello_world send greetings "Hello Kafka topic"

After sending the messages, you can see your worker start processing them
and print the greetings to the console.

Where to go from here...
------------------------

Now that you have seen a simple Faust application in action,
you should dive into the other sections of the :ref:`guide` or jump right
into the :ref:`playbooks` for tutorials and solutions to common patterns.
