
ainu
11.03.2017
20:38:47
Другое дело время компиляции - оно выше сильно.
Другое дело некая бажность. Его задачей было отдавать js файл, скомпиленный вебпаком.
Он отдавал заголовки заставляющие браузер кешировать. При этом иногда отдавал пустой файл.

Kirill
11.03.2017
20:40:22

Google

ainu
11.03.2017
20:40:45
Причем датой изменения ставит левую дату. Что мешает отладке.

Kirill
11.03.2017
20:41:06

ainu
11.03.2017
20:41:55
В инспекторе заголовок даты изменения, да. Обычный заголовок, любой http сервер его отдвет
Через stx.response.header.set можно поставить pragma: no csche
Но дата будет скакать, неизменная
Т.е. не поставить допустим далекое прошлое чтобы запретить кеширование

Kirill
11.03.2017
20:44:06
Смотрел я на fasthttp, такая шляпа
ну — что я тебе скажу. у меня весь прод на fasthttp и ни одной проблемы с ним не было. ты написал полную дичь, которая работает неадекватно, так что не надо втирать людям что то, в чем ты не разобрался настолько, что не смог отдать файлик — шляпа.
другой вопрос — покажи конкретно код, который ты написал и используемый коммит fasthttp, как и git status в нем.

ainu
11.03.2017
20:45:07
Мне как бы все равно у кого что на прод работает
Я заменил на net/http и кейс ctrl + s, alt + tab, f5 стал работать в 100% случаев, а не 95.

Kirill
11.03.2017
20:46:30

ainu
11.03.2017
20:47:05
Но так как такая движуха, я подниму старую версию, и сделаю воспроизведение того, про что говорю
Суть простая там сервинг одного статического файла, яваскрипт скомпиленный вебпаком

Google

ainu
11.03.2017
20:49:38
Мы же говорим про https://github.com/valyala/fasthttp ?

Kirill
11.03.2017
20:49:46

Yura
11.03.2017
22:02:37

Kirill
11.03.2017
22:03:14

Yura
11.03.2017
22:07:17
у меня там и полновесные страницы
Я могу быть не прав, т.к. опыта не имею с fasthttp. Я ориентируюсь на его же высказывания в README:
net/http handles more HTTP corner cases.
И, если у тебя полновесная страница с кучей бизнес-логики и десятком походов в базу, нафига экономить на спичках?
А вот если легковесное api, которое делает одну-две простых операций, то там имеет смысл каждый такт экономить.
Повторюсь: я могу быть не прав.
Все уже видели? http://www.tapirgames.com/blog/golang-syntax-sugars-and-exceptions

Kirill
11.03.2017
23:13:35


N
11.03.2017
23:44:53
Я могу быть не прав, т.к. опыта не имею с fasthttp. Я ориентируюсь на его же высказывания в README:
net/http handles more HTTP corner cases.
И, если у тебя полновесная страница с кучей бизнес-логики и десятком походов в базу, нафига экономить на спичках?
А вот если легковесное api, которое делает одну-две простых операций, то там имеет смысл каждый такт экономить.
разделяю твое мнение частично. для api стоит использовать в случаях высокой нагрузки ради экономии ресурсов, времени и то без фанатизма, чтобы не заниматься преждевременной оптимизацией. в остальных случаях смысла не вижу брать это. Отдавать статику, странички и прочее лучше через штатный http - там хоть http2 есть, кроме этого много сторонних библиотек и фреймворков используют штатный. Лично я брать это буду в крайнем случае, когда приспичит и не смогу ни горизонтально отмаштабироваться и ничего другого, когда трата времени на использование этой штуки и всех рисков с этим связанных будет оправдана. А так когда работы мало, а времени много можно брать и это, писать свои фреймворки поверх и пилить на нем все подряд, замеряя наносекунды и радуясь как все быстро, только как правило задержки на сети, на базе и тд на практике съедают больше времени чем реализация http и разницы там использовать http или fasthttp особо то и никакой.


Kirill
11.03.2017
23:46:51
разделяю твое мнение частично. для api стоит использовать в случаях высокой нагрузки ради экономии ресурсов, времени и то без фанатизма, чтобы не заниматься преждевременной оптимизацией. в остальных случаях смысла не вижу брать это. Отдавать статику, странички и прочее лучше через штатный http - там хоть http2 есть, кроме этого много сторонних библиотек и фреймворков используют штатный. Лично я брать это буду в крайнем случае, когда приспичит и не смогу ни горизонтально отмаштабироваться и ничего другого, когда трата времени на использование этой штуки и всех рисков с этим связанных будет оправдана. А так когда работы мало, а времени много можно брать и это, писать свои фреймворки поверх и пилить на нем все подряд, замеряя наносекунды и радуясь как все быстро, только как правило задержки на сети, на базе и тд на практике съедают больше времени чем реализация http и разницы там использовать http или fasthttp особо то и никакой.
в целом соглашусь, но мне проще так — я так могу код спокойно переиспользовать между проектами и не париться о переносе


Stanislav
12.03.2017
07:51:28
Доброе утро)
Как поведут себя тысячи спящих горутин?
Я создаю горутину, ложу её в сон на NN минут.
Через NN минут горутина должна удалить объект, если он не удален ранее.
Или какой есть еще способ отслеживания жизнь кучи объектов поминутно?

Andrew
12.03.2017
07:53:35
Другой способ - для кучи создать доп. поле с датой "когда удалить". Далее таймером перебирать допустим, каждые 5 сек, все объекты и смотреть дату.

Stanislav
12.03.2017
07:56:01
Даже если поставить перебор каждую минуту - неужели будет ефективней перебор тысячи объектов, чем запускать горутины, которые должны будут удалять через НН минут объект?

Andrew
12.03.2017
07:57:49
Я просто предложил другой способ, об эффективности не знаю...

N
12.03.2017
08:19:53

Stanislav
12.03.2017
08:31:17
конечно интересно

Yura
12.03.2017
08:32:26
А почему не добавлять элемент в список (слайс) со временем удаления? Как я понимаю, время удаления будет монотонно расти. Тогда одной горутиной можно спокойно этот список обрабатывать.
Также можно тупо использовать time.AfterFunc .
Но таймер - это на случай, если время удаления растет не монотонно. В монотонном случае список лучше.


N
12.03.2017
08:39:19
конечно интересно
для своей задачи, хоть она и отличается несколько от твоей я делал следующее: взял обычную реялизацию сбалансированного дерева, описал функцию сортировки дерева (дерево хранится всегда в отсортированном виде) в которой у меня было несколько полей еще кроме времени - фактически ключ индекса был составной. так вот тк дерево отсортировано встаем в начало дерева и берем первый элемент - если время пришло то удаляем его из дерева, если не пришло то дальше и не бежим по дереву а спим какое-то время. можно прибить эту горутину которая это делает к системному треду с помощью LockOSThread чтобы не думать что где-то что-то затупило и горутинка не проснулась во время после сна, но и плюсом я делал очень просто: бежал по дереву до тех пор пока время «протухания» было истинным, но это нужно если время сна например 5сек а обьекты могут протухать с частотой в 1 сек.

Google

N
12.03.2017
08:42:20
из минусов мы имеем более долгие операции вставки, удаления и тд с деревом если сравнивать с слайсом, но если нужена конкурентная вставка и большого кол-ва а-ля сотни-миллионы, то это работает

Yura
12.03.2017
08:50:17
А зачем дерево? Heap!
Угадай, как таймеры в Go работают? Используют heap.
Но это нужно, если время удаления не строго "текущее время + константная дельта", т.е. если может быть произвольным.
В противном случае, лучше просто список.

N
12.03.2017
09:04:12
Угадай, как таймеры в Go работают? Используют heap.
зачем угадывать? я прекрасно читаю Go-код, вся реализация как они работают есть на гитхабе в рантайме Go. при чем тут куча в оперативе я так и не понял, может имелось ввиду что структуры таймера в куче хранятся? ну это и так поняно, что не на стеке.
А зачем дерево? Heap!
дерево, чтобы не создавать миллион таймеров. почему? - смотри реализацию таймеров в Go, планировщиков в Go и тд. Также дерево, чтобы конкурентно вставлять и удалять из дерева данные, также оно отсортировано.

Yura
12.03.2017
09:09:57
Хинт: у меня маленький коммитик в гошные таймеры. Не то, чем стоит гордиться, просто к тому, что я в теме.

N
12.03.2017
09:13:48


Yura
12.03.2017
09:16:38
Я тебе дал ссылки. Если ты путаешь heap - структуру данных и heap - организацию памяти, это много говорит о твоем знании "теории".
Почитай по ссылкам.
BTW экскурс в историю: динамическая память стала называться heap, т.к. в перых реализациях широко использовалась структура данных heap.
В общем, иди читай википедию.
Забавно, что ты поигнорировал мое сообщение о моем коммите в реализацию гошных таймеров. Т.е. с высоты твоего невежества, ты даже не хочешь читать, что тебе пишет оппонент.

N
12.03.2017
09:20:08

Yura
12.03.2017
09:22:55
https://github.com/golang/go/blob/master/src/runtime/time.go
// Add a timer to the heap
// Delete timer t from the heap.
// Heap maintenance algorithms.

N
12.03.2017
09:24:03
молодец, нашел

Yura
12.03.2017
09:24:52
А теперь покажи, где там сортированное дерево.
А потом пойди и почитай таки ссылки на википедию: для чего придумана структура данных HEAP? Почему binary heap так часто для таймеров используют?
Расширяй кругозор.

N
12.03.2017
09:25:53

Yura
12.03.2017
09:27:30
Я с телефона, гитхаб номера строк в телефоне не выводит. Что в строке 91?

N
12.03.2017
09:29:45

Yura
12.03.2017
09:33:41
Чтобы не создавать миллион таймеров? Для этого и куча сойдёт, а она в реализации проще дерева. А написать конкурентное сбалансированное дерево - еще то упражнение.
Если ты такие пишешь, снимаю перед тобою шляпу.
А лок на слайс - это правда. Потому я уже раза два писал свои таймеры поверх встроенных. Только проблема решается просто: заводишь много слайсов с локом на каждый, и вставляешь в разные.
Собственно valyala так и предлагает починить таймеры в 1.9, и 99% вероятностью его патч будет принят.

N
12.03.2017
09:37:43

Google

Yura
12.03.2017
09:37:46
Т.е. сейчас, зная, что его патч будет принят, я сто раз подумаю, прежде чем свои таймеры писать.
А учитывая, что в оригинале Станислав предлагал по горутине на элемент, очевидно у него десятки миллионов элементов не предвидятся.
Да, ты не ответил: ты писал сбалансированное дерево, поддерживающее конкурентную вставку/удаление? Я бы хотел поучиться. Да и статья на хабре, думаю, много бы набрала плюсов.
Прости, вероятно для своей задачи ты писал.

N
12.03.2017
09:46:34

Yura
12.03.2017
09:48:12
Твоя реализация - коммерческая тайна? Очень хочется посмотреть. (Я искренне, без издевки).
Просто, я более-меннее в однопоточных алгоритмах подкован, но когда до параллельности доходит, ничего лучше чем "пошардить и по локу на шард" выдать не могу.
К чести признать, чаще всего шардирование решает задачу.

N
12.03.2017
09:52:19
я могу дать пейпер где я немного идей спер
я как раз нашел в закладках
http://www.cs.technion.ac.il/~erez/Papers/lfbtree-full.pdf

Yura
12.03.2017
09:53:37
Ок, спасибо :-)

Amigo
12.03.2017
09:57:09
в сео понимает кто-нибудь?
и в htaccess

Constantine
12.03.2017
10:04:51
не в тот чат ты пришел, мне кажется

Phil
12.03.2017
10:04:55
ты чатик перепутал

Amigo
12.03.2017
10:05:48
Просто нужно перекрыть траф с яндекса
думал разберётесь
а то сервер разрывается уже

Constantine
12.03.2017
10:06:26
не

Google

Constantine
12.03.2017
10:06:33
это не к нам

Amigo
12.03.2017
10:06:56
По миллиону уников в день заходит

Constantine
12.03.2017
10:07:47
беда какая
как ты с этим живешь?

Amigo
12.03.2017
10:08:15
дать контакты сеошника?
???
маркетинг
80лвл

Constantine
12.03.2017
10:08:27
чувак
ну каммон

Amigo
12.03.2017
10:08:32
шутка шутка

Constantine
12.03.2017
10:08:34
свали отсюда

Amigo
12.03.2017
10:08:37
просто проверить решил
ни каких ссылок

Constantine
12.03.2017
10:08:53
ага

ainu
12.03.2017
10:43:35
Более правильный способ отдавать заголовки last change или етокен