README.md

# CsQueue

Реализация менеджера очередей с гарантией доставки сообщения и произвольным содержимым.

## Installation

1. Add to dependencies

```elixir
def deps do
  [
    {:cs_queue, "~> 0.1.0"}
  ]
end
```

2. [Optional] Write to the project configuration path to the directory for queue copies

```elixir
  config :mnesia, dir: 'mnesia/#{Mix.env}/#{node()}'
```

By default if places in the root of your project and called 'Mnesia.<node()>'

3. Add mnesia directory to .gitignore.


```elixir
/Mnesia.*/ # Example for default. If you specified different folder on step 2 write your directory
```

4. Add application to extra starting applications in your mix.exs.

```elixir
  def application do
    [
      ...,
      extra_applications: [..., :cs_queue, ....],
      ...
    ]
  end
```



## Exercise
Реализовать на Elixir персистентную очередь сообщений со следующими возможностями:

- Добавить сообщение в конец очереди (add)

- Взять следующее сообщение из очереди на обработку (get)

- Подтвердить успешную обработку (ack)

- Сообщить об ошибке обработки (reject) — сообщение возвращается в конец очереди

Обработчиков сообщений может быть несколько, и они работают независимо друг от друга

1. результат работы - Elixir-библиотека, которую можно будет использовать для организации очереди в существующем приложении

2. в сообщениях содержится любой валидный term - на усмотрение кандидата

3. ack/reject после get ждем вечно

4. можно считать, что очередь всегда поместится в память

Очередь должна сохранять свое состояние между рестартами, в том числе внештатными, не терять сообщения и их статусы, успешно обработанные сообщения сохранять не надо, потребители - асинхронны и их может быть любое количество в разумных пределах, приложение может завершить свою работу в любой момент, в том числе внештатно. Выбор технологий и алгоритмов на усмотрение кандидата в заявленных рамках.