campaignmonitor / createsend-python

A Python library for the Campaign Monitor API
http://campaignmonitor.github.io/createsend-python
MIT License
57 stars 64 forks source link

Question: timing expectations #56

Open mbiokyle29 opened 6 years ago

mbiokyle29 commented 6 years ago

This is more of a question (apologies if this is the wrong place for this) about what kind of timing expectations can be expected from the API in regards to data syncing. The position I am in is:

I have the lookup wrapped in a "try, wait" loop to give the API some time to sync. I also lookup the last send email id (before making the request) to have an anchor to search from. Here is the code (more or less):

tx = Transactional({"api_key": "#######################"})

# get the last sent id before making the request
timeline = tx.message_timeline(
    params={
        "group": group
    }
)
sent_after_id = timeline[0].MessageID

# send the request (blocking)
actual_email = "foo@bar.com"
group = "foobar"
result = sent_request_to_service_b(actual_email, group)

found = False
attempts = 30
wait = 10
for i in range(attempts):
    timeline = tx.message_timeline(
        params={
            "group": group,
            "sentAfterId": sent_after_id
        }
    )

    sent_emails = [e.Recipient for e in timeline]
    found = any([actual_email == e for e in sent_emails])

    if found:
        break
    else:
        time.sleep(wait)

There are cases where this works (the email is found) on the very first try (i.e. the API is synced within a few seconds at most) and there are times where it takes 100+ seconds of waiting in order for the email to be found. I can go into the web browser and see the email in the Latest emails sent table long before the API resolves it. I am just wondering if there is some kind of rate limiting that is going on or some other magic happening? I ask because the behavior is fairly back and forth, it works on the first try, then it takes 100 seconds, then it works on the first try, etc (all with different emails that were sent the same way in the same time frame).

Everything is running createsend==4.2.7

I'd appreciate any advice you might have. Thanks for working on this api!