背景

项目中需要到图片上传的功能,对于非结构化的数据存储在S3中。于是设计了一个图片上传的方案。这个方案要求必须在用户上传的图片后,s3已经能获取到图片后才更新图片新的地址。

方案

整体流程:

a.客户端通过业务服务接口上传图片,并通过img 服务保存img信息,业务服务将业务id信息,img id等放在图片名称中;

b.业务服务通过s3统一服务上传图片,,此时业务不和imgId关联;

c. 判断图片是否上传成功,通过路径获取业务模块和业务id的消息;

d.消息发送到kafka;

e.img 服务监听到回掉消息;

f.通过img id 更新img的路径和状态;

g.a 服务也监听图片上传的消息;

h.a服务根据消息,判断是否是自己业务,然后根据业务id和img id关联;

i.最后client获取到图片信息;

总结经过这样处理,能完全保持只要图片上传成功就会能关联到新的图片。

主要流程

1.上传图片的格式:

/part/3738-1680862599359.jpg

3738: 数据库对应的Image Id

part:S3的存放的文件夹,也对应part service

1680862599359: 则是时间戳

2. 解析S3的事件:

{
"Records": [
    {
       "eventVersion":"2.1",
       "eventSource":"aws:s3",
       "awsRegion":"eu-west-2",
       "eventTime":"2020-04-05T13:55:30.970Z",
       "eventName":"ObjectCreated:Put",
       "userIdentity": {
           "principalId":"A2RFWU4TTDGK95"
        },
       "requestParameters": {
           "sourceIPAddress":"HIDDEN"
        },
       "responseElements": {
           "x-amz-request-id":"024EF2A2E94BD5CA",
           "x-amz-id-2":"P/5p5mDwfIu29SeZcNo3wjJaGAiM4yqBqp4p3gOfLVPeZhf+w5sRjnxsost3BuYub1FVf7tuMFs9KoC98+fwSI9NrT5WbjYq"
        },
       "s3": {
           "s3SchemaVersion":"1.0",
           "configurationId":"ImageUpload",
           "bucket": {
               "name":"HIDDEN",
               "ownerIdentity": {
                   "principalId":"A2RFWU4TTDGK95"
                },
               "arn":"arn:aws:s3:::HIDDEN"
            },
           "object": {
               "key":"activity1.png",
               "size": 41762,
               "eTag":"9e1645a32c2948139a90e75522deb5ab",
               "sequencer":"005E89E354A986B50D"
            }
        }
    }
]
}

然后lambda解析S3的事件实现流程如下:

1. 根据eventSource判断是不是来自s3;
2. 通过size判断图片是否是空,图片类型是否正确;
3. 通过key解析那个业务模块,image id;
4. 然后将业务模块和image id封装消息;
5. 发送kafka消息。

python
import json
import boto3
from kafka import KafkaProducerdef lambda_handler(event, context):# 获取S3事件信息eventSource = event['Records'][0]['eventSource']if eventSource not 'aws:s3':returns3_event = event['Records'][0]['s3']bucket_name = s3_event['bucket']['name']size = s3_event['object']['size']if size < 1:returnpath = s3_event['object']['key']service_name = path.split('/')[0]iamge_id = filename.split('-')[0]# 创建Kafka生产者kafka_producer = KafkaProducer(bootstrap_servers=['kafka-broker1:9092', 'kafka-broker2:9092'],value_serializer=lambda m: json.dumps(m).encode('ascii'))# 发送消息到Kafkamessage = {'service_name': service_name,'iamge_id': iamge_id}kafka_producer.send('my-topic', message)return {'statusCode': 200,'body': json.dumps('Message sent to Kafka')}

3. 上传s3的代如下:

@Service
public class S3Service {@Autowiredprivate AmazonS3 s3Client;@Value("${aws.bucketName}") private String bucketName;public String uploadFile(MultipartFile file) throws IOException {String key = UUID.randomUUID().toString();ObjectMetadata metadata = new ObjectMetadata();metadata.setContentLength(file.getSize());metadata.setContentType(file.getContentType());PutObjectRequest request = new PutObjectRequest(bucketName, key, file.getInputStream(), metadata);s3Client.putObject(request);return s3Client.getUrl(bucketName, key).toString();}
}

云原生应用之对象存储设计方案相关推荐

  1. kubernetes云原生纪元:共享存储-PVPVC(上)

    kubernetes云原生纪元:共享存储-PV&&PVC(上) 之前我们学习的都是无状态的服务,如果有状态的服务就非常麻烦,比如有的服务会把自己文件存放到自己服务器的目录上,如果直接嵌 ...

  2. 一个集成阿里云、腾讯云、七牛云对象存储的SDK

    概述 一个集成阿里云.腾讯云.七牛云对象存储的SDK An SDK integrating Alibaba cloud, Tencent cloud and qiniu cloud object st ...

  3. 云原生数据湖以存储、计算、数据管理等能力通过信通院评测认证

    又一项大能力-云原生数据湖获得信通院认证啦! 近日,中国信息通信研究院 (以下简称"信通院") 正式公布了第十四批"大数据产品能力评测"结果,腾讯云云原生数据湖 ...

  4. 百度云磁盘CDS、对象存储BOS技术深度解析

    在BAT中,百度在公有云也有很多技术创新.比如2013年引起广泛关注的ARM存储服务器就是一个很好的例子.最近两年,百度云开始发力,其云存储体系有诸多创新之处.目前百度云存储形成了以块存储.对象存储. ...

  5. un-app部署h5项目到普通云服务器--域名解析--OOS对象存储

    在不不使用前端托管,自己买了一个云服务器的情况 首先要进行云函数的url化 之后是项目部署 服务器一般是nginx 安装nginx 可以参考菜鸟网 windows+jenkins+gitea+node ...

  6. 阿里云培训-OSS(对象存储)

    什么是对象存储OSS 阿里云对象存储OSS(Object Storage Service)是一款海量.安全.低成本.高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99 ...

  7. 天翼云 Java对接OBS对象存储

    天翼云 对接OBS对象存储 前言 最近公司帮国企做一个项目,对方要求云厂商使用电信天翼云,我们之前一直都在使用阿里云,因为国企情况比较特殊,优先考虑国资背景的云厂商; 最近才改造完rocketMQ,现 ...

  8. tp6腾讯云、七牛云对象存储的工具类以及异步上传

    composer安装 composer require lorine/oss-utils 代码: use Lorine\OssUtils\OssService;$config = ['ak' => ...

  9. 【开发环境】(阿里云分布式文件系统)对象存储OSS 服务配置

    目录 一.开通 "对象存储 OSS" 服务: 二.创建 Bucket 容器: 1.创建一个Bucket: 三.使用 OSS 对象存储: 四.使用 SDK 访问 OSS: 1.安装使 ...

最新文章

  1. MyBatis传入多个参数的问题 - mingyue1818
  2. 四边形可以分为几类_四边形有几种类型
  3. 求m ,n 两个数的最小公倍数
  4. 大学生计算机课程考试试题,大学生计算机基础课程考试系统研究与实现
  5. 信道效率以及信道的吞吐率
  6. 使用VisualStudio开发php的图文设置方法
  7. SQL Server中全角和半角字符的比较问题
  8. IT人 不要一辈子靠技术生存(转
  9. abstract 抽象类
  10. 萤火虫(FA)算法(附完整Matlab代码,可直接复制)
  11. 中文文本纠错工具推荐:pycorrector
  12. mirrorlink
  13. Facebook想要成为下一个微信,难! 1
  14. linux下java加斜杠成了w符号_linux 特殊符号大全
  15. 备赛笔记:Opencv学习:颜色识别
  16. 用pecl命令安装php扩展geoip
  17. Unity3D粒子系统之制作火焰特效
  18. 直播风口之下,视频社交会成为下一个流量平台吗?
  19. 三次元操作规范及注意事项
  20. 华为od统一考试B卷【最少面试官数】Python 实现

热门文章

  1. 一起自学SLAM算法:3.4 图像特征点提取
  2. Windows XP也可以压缩磁盘和文件夹来增加磁盘空间
  3. STM32F407通过FSMC连接W5100S进行TCP网络通信
  4. excel如何插入无边框矩形
  5. 花名册信息填写另一个exceL简历表格里
  6. 充能书单|618,买什么都不如买知识!
  7. 闲鱼买的显卡用什么软件测试,二手折腾记 篇三:我从闲鱼上买到了一张不存在的显卡,RX 5900XT 拆解评测...
  8. vi命令整理(整理中)
  9. 赛门铁克企业级防病毒产品 》(Symantec Endpoint Protection)V11.0.6005.562 简体中文版[压缩包]
  10. 【java数据科学】1.提取数据以及清洗数据