понедельник, 16 сентября 2013 г.

Кролик подкинул мне говна

             Сегодня столкнулся с одной не документированной особенностью работы RabbitMQ.
Не с того ни с сего перестали отправляться сообщения в очередь. Причем сам вызов publish() проходил спокойно и не выдавал никаких исключений. Просто говорил - все в порядке хозяин, сообщение отправлено. Но в очереди это сообщение не появлялось. Зато уже после окончания выполнения скрипта - он подозрительно долго висел. Как будто что-то делал в одном из деструкторов. Прогон скрипта с strace показал что на самом деле при вызове publish -ничего не посылается - данные кладутся в буфер и возвращается true. Зато когда скрипт завершается - он честно пытался 3 раза послать это сообщение. В ответ он получает EAGAIN(Resource temporary unavailable). Не получилось послать с первого раза - ну и хер с ним с этим сообщением. Оно просто выбрасывается и ты никогда об этом не узнаешь. Тебе даже варнинга не покажут. Вот тебе и персистентные сообщения. Ясно что это не косяк RabbitMQ, но все равно неприятно. 
            Второй момент - почему все-таки RabbitMQ не принимает сообщения ? В логах пусто. Есть запись про то что он принял подключение - а про то что сообщение не смог принять - ни слова нету. Оказалось что ларчик просто открывался - тупо закончилось место на разделе. Ну мегабайт 300 там было, но RabbitMQ этого показалось  мало. Я одного не понимаю - почему не написать об этом в лог ?? Про то что коннект приняли - мы пишем, а то что такой ахтунг случился - нет.