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

Наш недавний проект заключался в том, чтобы синхронизировать списки наших локальных пользователей с Facebook «Custom Audience».

На первый взгляд это звучит очень просто:

- создать пользовательскую аудиторию
- с новым идентификатором аудитории отправить список пользователей
- Готово :)

Ну не совсем…

Что делать, если у вас есть списки из миллионов пользователей? Скорее всего, вы не сможете отправить их все сразу.
Facebook ограничивает вас отправкой фрагментов по 10 КБ за запрос.

Нет проблем, давайте запустим быстрый цикл порциями по 10 КБ и при каждом вращении будем отправлять запрос в Facebook.

Но еще не совсем там…

Что происходит теперь, когда вы получили дроссель API от Facebook, и вам нужно подождать несколько минут, чтобы они снова вас впустили.

Еще одно решение, теперь у нас есть очередь заданий, которая запускает этот запрос.
Мы запускаем цикл из 10 КБ фрагментов, и в случае ограничения мы обязательно получаем индекс последнего синхронизированного пользователя.

Теперь мы создаем новое задание с этим идентификатором пользователя, поэтому, когда оно будет запущено, оно обязательно запустится от этого пользователя и не будет повторно отправлять всех старых пользователей.

Приведенное выше решение отлично сработало, и теперь мы изучаем возможности «обновления» или «синхронизации» нашего списка с пользовательской аудиторией. Facebook это не очень нравится в их документах, и они не предлагают вам эту функцию.

Мы должны придумать обходной путь для этого, но до сих пор я не мог найти другого провайдера, предлагающего эту функцию, поэтому это, безусловно, будет большой проблемой.

пример псевдокода:

# Job
run(data):
    chunkSize = 10K
    startIndex = data['start'] || 0
    curr = startIndex
listId = data['listId'] || null
if is_null(listId):
        listId = FB.createList()
try:
        while True:
            usersChunk = UsersRepo.fetch(curr, chunkSize)
            if empty(usersChunk):
                break
            FB.addToList(usersChunk)
            curr += chunkSize
    catch ex:
        # handle exception however u need
        log('job was splitted')
        return createJob({startIndex: curr, listId: listId})
log('job was completed')

Thanks for reading this far :)
original post on my personal blog => facebook custom audience api