当前位置: 首页 > news >正文

网站建设需要有什么特点设计通网站建设

网站建设需要有什么特点,设计通网站建设,加若格网站做么样,2345网址导航官网下载安装来源#xff1a;http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代#xff0c;社交网站、搜索引擎的的迅猛发展对 Web 服务的后台管理系统提出了更高的需求。考虑几个常见的使用场景#xff1a; 社交网站的用户在其主页发布了一组新…来源http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代社交网站、搜索引擎的的迅猛发展对 Web 服务的后台管理系统提出了更高的需求。考虑几个常见的使用场景 社交网站的用户在其主页发布了一组新的照片这条新鲜事需要适时地推送至该用户的所有好友。该网站的活跃用户有千万级别在同一时刻会有非常多的“新鲜事推送”任务需要处理并且每个用户的好友数会达到 1000的级别。出于用户体验的考虑用户发布照片的这个操作需要在较短时间内得到反馈。在文献搜索系统的主页用户可以查到当前一小时内最热门的十大文献并且能够直接访问该文献。该文献管理系统所管理的文献数量非常多达到 PB 的级别。处于用户体验的考虑用户获得十大热门文献这个动作需要在较短时间内获得反馈。 考虑对于高并发大用户量的 Web 服务系统对于场景一和场景二中的需求如果在请求处理周期内完成这些任务然后再返回结果这种传统的做法会导致用户等待的时间过长。同时 Web 服务管理后台对任务处理能力也缺乏扩展性。 在这种场景下任务队列是有效的解决方案。在一个任务队列系统中“将新鲜事推送至用户 A 的所有好友”或者“查询当前最热门的十大文献”这种查询或者计算工作可以被当成一个“任务”。在任务队列系统中一般有任务生产者、任务处理中间方以及任务消费者三方。其中任务生产者负责生产任务比如“将新鲜事推送至用户 A 的所有好友”这一任务的发起方就可以称作任务生产者。任务处理中间方负责接收任务生产者的任务处理请求对任务进行调度最后将任务分发给任务消费者来进行处理。任务消费者就是执行任务的一方它负责接收任务处理中间方发来的任务处理请求完成这些任务并且返回任务处理的结果。在生产方、消费者和任务处理中间方之间一般使用消息传递的方式来进行通信。 在任务队列系统框架中任务消费者可以跨越不同的服务节点可以动态地增加节点来增加系统的任务处理能力非常适合高并发、需要横向扩展的 Web 服务后台。 回页首 Celery: 基于 Python 的开源分布式任务调度模块 Celery 是一个用 Python 编写的分布式的任务调度模块它有着简明的 API并且有丰富的扩展性适合用于构建分布式的 Web 服务。 图 1. Celery 的模块架构 Celery 的模块架构较为简洁但是提供了较为完整的功能 任务生产者 (task producer) 任务生产者 (task producer) 负责产生计算任务交给任务队列去处理。在 Celery 里一段独立的 Python 代码、一段嵌入在 Django Web 服务里的一段请求处理逻辑只要是调用了 Celery 提供的 API产生任务并交给任务队列处理的我们都可以称之为任务生产者。 任务调度器 (celery beat) Celery beat 是一个任务调度器它以独立进程的形式存在。Celery beat 进程会读取配置文件的内容周期性地将执行任务的请求发送给任务队列。Celery beat 是 Celery 系统自带的任务生产者。系统管理员可以选择关闭或者开启 Celery beat。同时在一个 Celery 系统中只能存在一个 Celery beat 调度器。 任务代理 (broker) 任务代理方负责接受任务生产者发送过来的任务处理消息存进队列之后再进行调度分发给任务消费方 (celery worker)。因为任务处理是基于 message(消息) 的所以我们一般选择 RabbitMQ、Redis 等消息队列或者数据库作为 Celery 的 message broker。 任务消费方 (celery worker) Celery worker 就是执行任务的一方它负责接收任务处理中间方发来的任务处理请求完成这些任务并且返回任务处理的结果。Celery worker 对应的就是操作系统中的一个进程。Celery 支持分布式部署和横向扩展我们可以在多个节点增加 Celery worker 的数量来增加系统的高可用性。在分布式系统中我们也可以在不同节点上分配执行不同任务的 Celery worker 来达到模块化的目的。 结果保存 Celery 支持任务处理完后将状态信息和结果的保存以供查询。Celery 内置支持 rpc, Django ORMRedisRabbitMQ 等方式来保存任务处理后的状态信息。 回页首 构建第一个 Celery 程序 在我们的第一个 Celery 程序中我们尝试在 Celery 中构建一个“将新鲜事通知到朋友”的任务并且尝试通过编写一个 Python 程序来启动这个任务。 安装 Celery Pip install celery 选择合适的消息代理中间件 Celery 支持 RabbitMQ、Redis 甚至其他数据库系统作为其消息代理中间件在本文中我们选择 RabbitMQ 作为消息代理中间件。 sudo apt-get install rabbitmq-server 创建 Celery 对象 Celery 对象是所有 Celery 功能的入口所以在开始其它工作之前我们必须先定义我们自己的 Celery 对象。该对象定义了任务的具体内容、任务队列的服务地址、以及保存任务执行结果的地址等重要信息。 # notify_friends.py from celery import Celery import time app Celery(notify_friends, backendrpc://, brokeramqp://localhost)app.task def notify_friends(userId, newsId):print Start to notify_friends task at {0}, userID:{1} newsID:{2}.format(time.ctime(), userId, newsId)time.sleep(2)print Task notify_friends succeed at {0}.format(time.ctime())return True 在本文中为了模拟真实的应用场景我们定义了 notify_friends 这个任务它接受两个参数并且在输出流中打印出一定的信息 创建 Celery Worker 服务进程 在定义完 Celery 对象后我们可以创建对应的任务消费者--Celery worker 进程后续的任务处理请求都是由这个 Celery worker 进程来最终执行的。 celery -A celery_test worker --loglevelinfo 在 Python 程序中调用 Celery Task 我们创建一个简单的 Python 程序来触发 notify_friends 这个任务。 # call_notify_friends.pyfrom notify_friends import notify_friends import timedef notify(userId, messageId):result notify_friends.delay(userId, messageId)while not result.ready():time.sleep(1)print result.get(timeout1)if __name__ __main__:notify(001, 001) 我们在 call_notify_friends.py 这个程序文件中定义了 Notify 函数它调用了我们之前定义的 notify_friends 这个 API来发送任务处理请求到任务队列并且不断地查询等待来获得任务处理的结果。 Celery worker 中的 log 信息 [tasks]. celery_test.notify_friends[2015-11-16 15:02:31,113: INFO/MainProcess] Connected to amqp://guest:**127.0.0.1:5672// [2015-11-16 15:02:31,122: INFO/MainProcess] mingle: searching for neighbors [2015-11-16 15:02:32,142: INFO/MainProcess] mingle: all alone [2015-11-16 15:02:32,179: WARNING/MainProcess] celeryyuwenhao-VirtualBox ready. [2015-11-16 15:04:45,474: INFO/MainProcess] Received task: celery_test.notify_friends[3f090a76-7678-4f9c-a37b-ceda59600f9c] [2015-11-16 15:04:45,475: WARNING/Worker-2] Start to notify_friends task at Mon Nov 16 15:04:45 2015, userID:001 newsID:001 [2015-11-16 15:04:47,477: WARNING/Worker-2] Task notify_friends succeed at Mon Nov 16 15:04:47 2015 [2015-11-16 15:04:47,511: INFO/MainProcess] Task celery_test.notify_friends[3f090a76-7678-4f9c-a37b-ceda59600f9c] succeeded in 2.035536565s: True 我们可以看到Celery worker 收到了 Python 程序的 notify_friends 任务的处理请求并且执行完毕。 回页首 利用调度器创建周期任务 在我们第二个 Celery 程序中我们尝试构建一个周期性执行“查询当前一小时最热门文献”的任务每隔 100 秒执行一次并将结果保存起来。后续的搜索请求到来后可以直接返回已有的结果极大优化了用户体验。 创建配置文件 Celery 的调度器的配置是在 CELERYBEAT_SCHEDULE 这个全局变量上配置的我们可以将配置写在一个独立的 Python 模块在定义 Celery 对象的时候加载这个模块。我们将 select_populate_book 这个任务定义为每 100 秒执行一次。 # config.py from datetime import timedeltaCELERYBEAT_SCHEDULE {select_populate_book: {task: favorite_book.select_populate_book,schedule: timedelta(seconds100),}, } 创建 Celery 对象 在 Celery 对象的定义里我们加载了之前定义的配置文件并定义了 select_populate_book 这个任务。 #favorite_book.py from celery import Celery import timeapp Celery(select_populate_book, backendrpc://, brokeramqp://localhost) app.config_from_object(config)app.task def select_populate_book():print Start to select_populate_book task at {0}.format(time.ctime())time.sleep(2)print Task select_populate_book succeed at {0}.format(time.ctime())return True 启动 Celery worker celery -A favorite_book worker --loglevelinfo 启动 Celery beat 启动 Celery beat 调度器Celery beat 会周期性地执行在 CELERYBEAT_SCHEDULE 中定义的任务即周期性地查询当前一小时最热门的书籍。 celery -A favorite_book beatyuwenhaoyuwenhao:~$ celery -A favorite_book beat celery beat v3.1.15 (Cipater) is starting. __ - ... __ - _ Configuration -. broker - amqp://guest:**localhost:5672//. loader - celery.loaders.app.AppLoader. scheduler - celery.beat.PersistentScheduler. db - celerybeat-schedule. logfile - [stderr]%INFO. maxinterval - now (0s) [2015-11-16 16:21:15,443: INFO/MainProcess] beat: Starting... [2015-11-16 16:21:15,447: WARNING/MainProcess] Reset: Timezone changed from UTC to None [2015-11-16 16:21:25,448: INFO/MainProcess] Scheduler: Sending due task select_populate_book (favorite_book.select_populate_book) [2015-11-16 16:21:35,485: INFO/MainProcess] Scheduler: Sending due task select_populate_book (favorite_book.select_populate_book) [2015-11-16 16:21:45,490: INFO/MainProcess] Scheduler: Sending due task select_populate_book (favorite_book.select_populate_book) 我们可以看到Celery beat 进程周期性地将任务执行请求 select_populate_book 发送至任务队列。 yuwenhaoyuwenhao:~$ celery -A favorite_book worker --loglevelinfo [2015-11-16 16:21:11,560: WARNING/MainProcess] /usr/local/lib/python2.7/dist-packages/celery/apps/worker.py:161: CDeprecationWarning: Starting from version 3.2 Celery will refuse to accept pickle by default.The pickle serializer is a security concern as it may give attackers the ability to execute any command. Its important to secure your broker from unauthorized access when using pickle, so we think that enabling pickle should require a deliberate action and not be the default choice.If you depend on pickle then you should set a setting to disable this warning and to be sure that everything will continue working when you upgrade to Celery 3.2::CELERY_ACCEPT_CONTENT [pickle, json, msgpack, yaml]You must only enable the serializers that you will actually use.warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))-------------- celeryyuwenhao-VirtualBox v3.1.15 (Cipater) ---- **** ----- --- * *** * -- Linux-3.5.0-23-generic-x86_64-with-Ubuntu-12.04-precise -- * - **** --- - ** ---------- [config] - ** ---------- . app: select_populate_book:0x1b219d0 - ** ---------- . transport: amqp://guest:**localhost:5672// - ** ---------- . results: rpc:// - *** --- * --- . concurrency: 2 (prefork) -- ******* ---- --- ***** ----- [queues]-------------- . celery exchangecelery(direct) keycelery[tasks]. favorite_book.select_populate_book[2015-11-16 16:21:11,579: INFO/MainProcess] Connected to amqp://guest:**127.0.0.1:5672// [2015-11-16 16:21:11,590: INFO/MainProcess] mingle: searching for neighbors [2015-11-16 16:21:12,607: INFO/MainProcess] mingle: all alone [2015-11-16 16:21:12,631: WARNING/MainProcess] celeryyuwenhao-VirtualBox ready. [2015-11-16 16:21:25,459: INFO/MainProcess] Received task: favorite_book.select_populate_book[515f7c55-7ff0-4fcf-bc40-8838f69805fd] [2015-11-16 16:21:25,460: WARNING/Worker-2] Start to select_populate_book task at Mon Nov 16 16:21:25 2015 [2015-11-16 16:21:27,462: WARNING/Worker-2] Task select_populate_book succeed at Mon Nov 16 16:21:27 2015 [2015-11-16 16:21:27,475: INFO/MainProcess] Task favorite_book.select_populate_book [515f7c55-7ff0-4fcf-bc40-8838f69805fd] succeeded in 2.015802141s: True [2015-11-16 16:21:35,494: INFO/MainProcess] Received task: favorite_book.select_populate_book[277d718a-3435-4bca-a881-a8f958d64aa9] [2015-11-16 16:21:35,498: WARNING/Worker-1] Start to select_populate_book task at Mon Nov 16 16:21:35 2015 [2015-11-16 16:21:37,501: WARNING/Worker-1] Task select_populate_book succeed at Mon Nov 16 16:21:37 2015 [2015-11-16 16:21:37,511: INFO/MainProcess] Task favorite_book.select_populate_book [277d718a-3435-4bca-a881-a8f958d64aa9] succeeded in 2.014368786s: True 我们可以看到任务 select_populate_book 的 Celery worker 周期性地收到 Celery 调度器的任务的处理请求并且运行该任务。 回页首 结束语 任务队列技术可以满足 Web 服务系统后台任务管理和调度的需求适合构建分布式的 Web 服务系统后台。Celery 是一个基于 Python 的开源任务队列系统。它有着简明的 API 以及良好的扩展性。本文首先介绍了队列技术的基本原理然后介绍了 Celery 的模块架构以及工作原理。最后本文通过实例介绍了如何在 Python 程序中调用 Celery API 并通过 Celery 任务队列来执行任务以及如何通过 Celery beat 在 Celery 任务队列中创建周期性执行的任务。希望本文可以对 Web 后台开发者、以及 Celery 的初学者有所帮助。
http://wiki.neutronadmin.com/news/140817/

相关文章:

  • 好牛网站建设合肥网站建设百家号
  • 营销型网站开发流程包括wordpress百家主题
  • 苏州网站优化排名推广建设环保网站查询系统
  • 1g内存vps 开电影网站广州智迅网络做网站
  • 制作游戏网站南阳网站排名优化公司
  • 电子商务系统建设网站策划书wordpress幻灯片插件下载
  • 大同网站建设哪里好怎么做网站设计
  • 山西省财政厅门户网站三基建设专栏ui设计和平面设计哪个难
  • 翻译做网站泰安做网站
  • 网站建设情况调查表应用软件开发需要学什么
  • 做ppt的软件怎样下载网站青岛网站建设服务
  • 郑州网站建设微信小程序公司主页和公司网站
  • 网站 建设 欢迎你4米高挡土墙模板加固
  • 免费推广网站2023哪里做网站优化
  • 手机网站免费优化软件技术论坛
  • wordpress建好本地站怎么上传广州建设专修学院
  • 建设个人网站用什么软件好内蒙古呼和浩特市做网站的公司
  • 学校网站建设的重要意义做网站的公司哪里好
  • 域名主机 网站建设百度收录查询工具官网
  • 做学校网站素材图片百度账号怎么改用户名
  • 沈阳建设网站哪家好企业管理系统开源
  • 江苏天宇建设集团网站友情链接检测平台
  • 汕头潮南网站建设北京市住房城乡建设厅网站首页
  • 一个企业网站ppt怎么做办公管理软件
  • 什么是域名系统 网站建设教程宣传片制作合同
  • 怎么建设个人网站杭州网站快速备案
  • 上海网站网站建设开发公司工程部经理述职报告
  • wordpress适应式网站博客模板让网站建设便宜到底
  • 贵州住房和城乡建设厅官方网站做网站商城需要什么
  • 网站地址做图标网站开发包括什么