For your first question, this can be avoided by checking what data changed and updating Shopify only if you need to.
One way I've dealt this in the past is to store a json object of state that I care about (eg. price and inventory) in a product metafield. Then when I receive a product update webhook I first fetch this metafield (via the Admin API) and compare it against the webhook payload. If they don't match then I update Shopify (and the metafield) otherwise I do nothing.