Kwestia ta została już wysłana na forach AWS, ale jeszcze pozostaje bez odpowiedzi https://forums.aws.amazon.com/thread.jspa?threadID=94589Śmiesznie powolne zapisy do Amazon DynamoDB (PHP API)
Próbuję wykonać wstępną przesyłanie długiej listy krótkich pozycji (około 120 milionów z nich), aby pobrać je później za pomocą unikalnego klucza, i wydaje się, że jest to doskonały przypadek dla DynamoDb.
Jednak moja aktualna szybkość zapisu jest bardzo powolna (około 8-9 sekund na 100 zapisów), co sprawia, że początkowe przesłanie jest prawie niemożliwe (zajęłoby to około 3 miesięcy z bieżącym tempem).
Czytałem fora AWS wyglądające na odpowiedź i już wypróbowany następujące rzeczy:
przeszedłem z singlem „put_item” Połączenia do zapisu partii o 25 pozycji (zalecana maksymalna wielkość partii zapisu), a każdy z moich przedmiotów jest mniejszy niż 1Kb (który jest również zalecany). To bardzo typowe, nawet w przypadku 25 moich produktów, które również mają mniej niż 1Kb, ale nie jest to gwarantowane (i nie powinno to mieć znaczenia, ponieważ rozumiem, że dla DynamoDB ważna jest tylko wielkość pojedynczego elementu).
Używam ostatnio wprowadzonego regionu UE (jestem w Wielkiej Brytanii), określając punkt wejścia bezpośrednio przez wywołanie set_region ("dynamodb.eu-west-1.amazonaws.com"), ponieważ najwyraźniej nie ma innego sposobu zrobić to w PHP API. Konsola AWS pokazuje, że tabela w odpowiednim regionie, tak że działa.
Wyłączyłem SSL, wywołując funkcję disable_ssl() (uzyskując 1 sekundę na 100 rekordów).
Mimo to zestaw testowy zawierający 100 pozycji (4 zadania zapisu partii na 25 pozycji) indeksowanie nie trwa nigdy dłużej niż 8 sekund. Każde żądanie zapisu wsadowego trwa około 2 sekund, więc nie jest tak, że pierwsze jest natychmiastowe, a następnie żądania są powolne.
Moją tabelą wydajności jest 100 zapisów i 100 odczytów jednostek, które powinny wystarczyć do tej pory (wypróbowane wyższe limity, a także na wszelki wypadek, bez efektu).
Wiem również, że są pewne wydatki na serializację żądania, więc prawdopodobnie mogę użyć kolejki do "akumulacji" moich żądań, ale czy to naprawdę ma znaczenie dla skryptów wsadowych? I nie sądzę, że to jest problem, ponieważ nawet jedna prośba trwa zbyt długo.
Zauważyłem, że niektórzy ludzie modyfikują nagłówki cURL ("Expect:" w szczególności) w API, aby przyspieszyć żądania, ale nie sądzę, że to jest właściwy sposób, a także API zostało zaktualizowane od tego czasu porady zostały zamieszczone.
Serwer, na którym działa moja aplikacja, jest również w porządku - czytałem, że czasami obciążenie procesora przechodzi przez dach, ale w moim przypadku wszystko jest w porządku, to tylko żądanie sieciowe trwa zbyt długo.
Utknąłem teraz - czy jest coś jeszcze, co mogę spróbować? Jeśli nie dostarczyłem wystarczającej ilości informacji, poproś o więcej informacji.
Istnieją inne ostatnie wątki, podobno na ten sam problem, here (brak odpowiedzi na razie).
Ta usługa ma być bardzo szybka, więc jestem bardzo zaskoczony tym problemem na samym początku.
Wygląda na to, że potrzebujesz relacyjnej bazy danych, takiej jak SQL Server. Po prostu 'SqlBulkCopy' dane. SQL Server jest skalowalna, jeśli pytasz. –
Nie potrzebuję tutaj relacyjnej bazy danych (jest to płaski indeks bez rzeczywistych relacji), ale tak, myślę o wycofaniu się do mySQL lub Solr, jeśli nie mam innych opcji. Jednak na razie wciąż chcę zrozumieć, co jest nie tak z tym podejściem. – Yuriy
Twój wpis na forum został odpowiedział na: https://forums.aws.amazon.com/thread.jspa?messageID=365597#365597 –