WordPress comes with its own cron job that allows you to schedule your posts and events. However, in many situations, the WP-Cron is not working well and leads to posts missed their publication schedule and/or scheduled events not executed.
To understand why this happen, we need to know that the WP-Cron is not a real cron job. It is in fact a virtual cron that only works when a page is loaded. In short, when a page is requested on the frontend/backend, WordPress will first load WP-Cron, follow by the necessary page to display to your reader. The loaded WP-Cron will then check the database to see if there is any thing that needs to be done.
Reasons for WP-Cron to fail could be due to:
DNS issue in the server.
Plugins conflict
Heavy load in the server which results in WP-Cron not executed fully
WordPress bug
Using of cache plugins that prevent the WP-Cron from loading
And many other reasons