OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

24 | 实战:处理四层流量,实现Memcached Server

欢迎转发文章给同事朋友
欢迎留言和讨论
完善版本的后续内容
动手作业
实现set函数
实现get函数
解析memcached命令的参数
搭建代码框架
设置Nginx的配置文件
使用resty进行手动测试
构造最简单的测试案例
memcached协议的具体内容
选择使用OpenResty来实现memcached server的原因
HTTPS流量逐渐成为主流
为什么要实现一个memcached server
作者:温铭
标题:实战:处理四层流量,实现Memcached Server
写在最后
填充代码
搭建框架
测试驱动开发
原始需求和技术方案
参考文章
实战:处理四层流量,实现Memcached Server

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
在前面几节课中,我们介绍了不少处理请求的 Lua API ,不过它们都是和七层相关的。除此之外,OpenResty 其实还提供了 stream-lua-nginx-module 模块来处理四层的流量。它提供的指令和 API ,与 lua-nginx-module 基本一致。
今天,我就带你一起用 OpenResty 来实现一个 memcached server,而且大概只需要 100 多行代码就可以完成。在这个小的实战中,我们会用到不少前面学过的内容,也会带入一些后面测试和性能优化章节的内容。
所以,我希望你能够明确一点,我们这节课的重点,不在于你必须读懂每一行代码的具体作用,而是你要从需求、测试、开发等角度,把 OpenResty 如何从零开发一个项目的全貌了然于心。

原始需求和技术方案

在开发之前,我们都需要明白需求是什么,到底是用来解决什么问题的,否则就会在迷失在技术选择中。比如看到我们今天的主题,你就应该先反问一下自己,为什么要实现一个 memcached server 呢?直接安装一个原版的 memcached 或者 redis 不就行了吗?
我们知道,HTTPS 流量逐渐成为主流,但一些比较老的浏览器并不支持 session ticket,那么我们就需要在服务端把 session ID 存下来。如果本地存储空间不够,就需要一个集群进行存放,而这个数据又是可以丢弃的,所以选用 memcached 就比较合适。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

使用OpenResty实现memcached server的实战过程。作者首先明确了需求和技术方案,解释了为什么选择使用OpenResty来实现memcached server,而不是直接引入memcached。接着,作者提到了测试驱动开发的思想,并给出了一个最简单的测试案例。然后,作者搭建了Nginx的配置文件和代码框架,展示了如何在stream上下文中监听端口,并使用shared dict来存储数据。最后,作者展示了入口函数的主要逻辑,虽然还没有做异常处理和具体的操作函数,但这个框架已经完整表达了memcached server的逻辑。整体来说,本文以实战的方式介绍了如何使用OpenResty来实现一个memcached server,强调了需求明确、测试驱动开发和搭建框架的重要性。文章中还提供了填充代码和实现`get`和`set`函数的示例,以及对调试工具的讨论。最后,作者留下了动手作业,鼓励读者通过测试案例来完善实现代码,并期待读者通过后续学习进一步完善版本。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 2xshu
    老师,这篇文章我反复看了几遍。其实我还是没有领会做这个项目的真正目的和使用场景呢。因为我理解的是即是做了这样封装,和直接使用ngx.shared.DICT感觉没什么区别呢?ngx.shared.DICT操作也是原子操作的,并且ngx.shared.DICT也是一个全局共享的变量。

    作者回复: 最大的不同之处在于可以支持集群,而共享字典只能是单机使用。

    2019-07-22
    5
    6
  • 罐头瓶子
    openresty lua的断点调试现在可以使用vscode插件的方式来实现。插件的名字叫luaide,我现在正在使用,挺好用的。

    作者回复: 👍

    2019-07-19
    5
  • katichar
    在http和stream之前实现数据共享,如果对性能有要求,是不是resty.memcached是一个比较好的方案?

    作者回复: 走了一层外部的网络通信,性能会有一些影响,但貌似也是当前的一个方案。最好是内部打通,期望 OpenResty 实现这个功能。

    2019-07-19
    2
    3
  • 写点啥呢
    请问老师,你在@2xshu同学的留言里提到了这个实现支持集群,而共享字典只能单机使用,我没有理解,请问支持集群是指可以跨物理机共享存储么?那具体是如何做到的呢?

    作者回复: 你使用 memcached 的客户端,都是支持一致性 hash 这样的算法,这样就等于是实现了集群储存了。

    2019-09-06
    2
    1
  • HelloBug
    我在执行这里的例子的时候,解决了一些语法错误之后,已经能够正常的在resty -e执行时设置和获得key value了,但是在服务器侧循环报一个错误,2019/07/27 13:35:43 [error] 25017#25017: *1 attempt to receive data on a closed socket: u:00007FDA656A5530, c:00007FDA655FE3F0, ft:0 eof:1, client: 127.0.0.1, server: 0.0.0.0:11212。这个错误,通过设置指令lua_socket_log_errors off;的确关闭了错误的循环打印,这里的根本原因是,因为server.lua里是一个循环,然后客户端断开socket了,服务侧还在循环读取数据,导致一直提示这个错误吗?

    作者回复: 是的,这种错误是可以忽略的

    2019-07-27
    4
    1
  • helloworld
    和2xshu同学的感受一样,使用共享字典封装模拟成memcached服务,和直接使用共享字典,对于项目需求到低有啥本质区别,对于这个项目需求直接使用共享字典不就行了嘛,为啥还要费事的去封装一遍呢,求解惑。

    作者回复: 直接使用共享字典就没有办法做到集群了,只能用本机的内存资源

    2019-07-24
    2
    1
  • 连边
    我写了一个空的代码,直接写一个死循环,会直接导致cpu 100%。这是正常情况?

    作者回复: 要看下循环里面具体做了什么

    2019-08-20
  • 连边
    老师见字好。我来实现文中逻辑,但是最后总说我连接close,详情如下:https://www.iffor.cn/job/openresty-memcached-server.html,有时间的时候帮我看看。我这边准备按照memcache去找一找原因。

    作者回复: 你给的链接中没有具体的报错信息。另外,/usr/local/openresty3/lib/resty/memached 这个目录是拼写错了吗?最后的目录名应该 memcached 而不是 memached,少了一个字母 c

    2019-07-31
    2
  • 老师,这次示例memcached server还是没有调通,您在后面答疑的时候能大约讲一下吗

    作者回复: 是哪一部分的问题呢?有具体的报错吗?

    2019-07-30
  • helloworld
    如果是为了实现memcached集群,那服务端口就不能监听127.0.0.1了,对吧

    作者回复: 是的,这个需要修改下

    2019-07-24
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部